regex über ein dataframe

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