regex über ein dataframe
Contents
regex über ein dataframe#
J.Busse, www.jbusse.de, 2022-04-19
Lizenz: public domain / CC 0
Aufgabenstellung:
Gegeben ist ein Liste von Dateinamen. Klassifiziere die Dateinamen nach der Endung!
Nebenbedingung: Um nachfolgende Textmining-Schritte gut vorzubereiten, wollen wir diese und viele weitere Analyse-Ergebnisse in einer Tabelle, in Python also einem Pandas-Dataframe festhalten.
import numpy as np
import pandas as pd
import re
import glob
Dateien anzeigen#
Was in Linux ein ls
wäre, geht in Python so:
# filename_list = glob.glob("mm/*")
filename_list = [ "./data/mm/jb1.mm", "../home/hallo.py"]
print(filename_list)
['./data/mm/jb1.mm', '../home/hallo.py']
Regex für Pfad, Name, Extension#
Aufgabe: Schreibe eine Funktion pne()
, die Pfad, Name und Extension ohne die entsprechenden Trennzeichen als Tupel zurückgibt:
Eingabe:
pne("mm/jb-1-1.mm")
Rückgabe:
("mm", "jb-1-1", "mm")
Spielwiese: https://regex101.com/
Hinweis: Natürlich gibt es diese Funktion auch in einer Bibliothek. Aber wir wollen ja regex ausprobieren, richtig?
def pne(filename):
# suboptimale Lösung: mit regex besser machen!
# return filename[0:2], filename[4:-3], filename[-2:]
regex = r"(.+)\/(.+)\.(.+)"
m_search = re.search(regex, filename)
return m_search[1], m_search[2], m_search[3]
pne("ein/pfad/datei.md")
('ein/pfad', 'datei', 'md')
regex = r"(.+)\/(.+)\.(.+)"
test_str = ("ein/pfad/datei.md\n./data/md/hallo.pdf")
match = re.findall(regex, test_str)
match
m_search = re.search(regex, test_str)
m_search[3]
'md'
Damit kann man nun typischerweise mit List-Comprehension eine neue Liste erzeugen:
filename_pne = [ pne(f) for f in filename_list ]
print(filename_pne)
[('./data/mm', 'jb1', 'mm'), ('../home', 'hallo', 'py')]
Oder ein schickes Dictionary:
filename_dict = { f: pne(f) for f in filename_list }
print(filename_dict)
{'./data/mm/jb1.mm': ('./data/mm', 'jb1', 'mm'), '../home/hallo.py': ('../home', 'hallo', 'py')}
Pandas#
Mit pandas.DataFrame.from_dict lässt sich solcg ein dict elegant in ein Pandas Dataframe überführen:
dateien_df = pd.DataFrame.from_dict(filename_dict,
orient='index',
columns = ["path", "name", "ext"])
dateien_df.head()
path | name | ext | |
---|---|---|---|
./data/mm/jb1.mm | ./data/mm | jb1 | mm |
../home/hallo.py | ../home | hallo | py |