Regex: Viele Suchbegriffe in einem Ausdruck oder wenige?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Hallo zusammen,

ich möchte einen Text nach verscheidenen Schlagwörtern zeilenweise durchsuchen. Welches Vorgehen ist dann günstiger, nach z.B. drei Schlagworten in einem Ausdruck zu suchen:

Code: Alles auswählen

for line in file:
    m = re.findall( '(sw1)|(sw2)|(sw3)', line)
    <arbeite mit m>
Oder ist es besser, für jedes Schlagwort einen eigenen Ausdruck anzulegen und den dann zu bearbeiten:

Code: Alles auswählen

for line in file:
    for sw in (sw1, sw2, sw3):
        m = re.findall( '(%s)' % (sw), line)
        <arbeite mit m>
Es sind einige 100 Schlagworte und die Dateien sind recht lang, so 20000 bis 30000 Zeilen Text.

Der Ausdruck, den ich für die kombinierte Suche verwenden würde, sähe so aus:

Code: Alles auswählen

\W+(sw2)\W|\W+(sw3)\W
Er tut scheinbar das, was er soll, auch wenn er ein Schlagwort am Anfang der Zeile (ohne whitespace) nicht erkennt (was aber ok ist).

Welches ist der bessere Weg?

Gruß und Danke,

Christoph
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Was meinst du mit "günstiger"? Wenn es um Lesbarkeit geht, dann würde ich eine Schleife bevorzugen. Wenn es um Geschwindigkeit geht, dann müsstest du es einfach mal testen. Beide Verfahren sind ja leicht implementiert.

Bei der Gelegenheit solltest du dir noch die re.escape-Funktion anschauen. Im Moment setzt du die Suchstrings einfach mit einfacher Stringformatierung zusammen, das wird aber spätestens dann zu Problemen führen, wenn du Suchstrings verwendest, welche reservierte Zeichen enthalten.
Das Leben ist wie ein Tennisball.
BlackJack

@ChrisGTJ: Probier's doch einfach aus.

Der kombinierte Ausdruck kann vereinfacht werden. Das '+' sollte nicht nötig sein, und wenn jede Alternative mit dem gleichen Teilausdruck startet und endet, dann kann man das auch *einmal* am Anfang und am Ende machen: r'\W(sw2|sw3)\W'. Und dann kann man da noch leeren Anfang und/oder leeres Ende einbauen: r'(?:^|\W)(sw2|sw3)(?:\W|$)'.
Antworten