2016-06-17 14 views
4

Ich möchte auf dieser Regel, wenn eine Zeichenfolge entspricht finden einen regulären Ausdruck:Python re: wenn string ein Wort UND eine Wortliste hat?

list_of_words = ['a', 'boo', 'blah'] 
if 'foo' in temp_string and any(word in temp_string for word in list_of_words) 

Der Grund, warum ich es in einem regulären Ausdruck will, ist, dass ich Hunderte von Regeln, wie es habe und anders es so will ich um sie alle als Muster in einem Diktat zu speichern.

Das einzige, was ich denken konnte, ist dies aber es scheint nicht recht:

re.search(r'foo.*(a|boo|blah)|(a|boo|blah).*foo') 
+0

"Ich möchte sie in einem Diktat speichern" erfordert nicht unbedingt, dass Sie eine Regex erstellen. Solange Sie alle Daten haben, die Sie benötigen, um die Logik zu rekonstruieren, was ist es wichtig, wie sie gespeichert ist? '{" was auch immer ": (" foo ", (" a "," boo "," blah "))}} ist ebenso ein gültiges Diktat wie' '{" was auch immer ": r'foo. * (a | boo | blah) | (a | boo | blah). * foo '} '' – Kevin

+1

würde nicht (mehr oder weniger) 'if re.search (' foo ') und re.search (" (a | boo | blah) "):' Mach was du willst? –

+1

Ich habe versucht, ich habe 100 verschiedene Regeln und sie unterscheiden sich. Ich kann nicht zu sehr ins Detail gehen, aber das Speichern als Wortgruppe funktioniert nicht für mich. Es würde sehr kompliziert werden und jeder, der sich mit dem Wörterbuch nicht auskennt, was jeder Satz bedeutet (ist es ein OR oder ein UND), würde Schwierigkeiten haben. Ein regelmäßiger Ausdruck lässt keinen Raum zum Raten. Vielleicht hätte ich nicht sagen sollen "Regeln wie es" –

Antwort

5

Sie die Array-Elemente | mit beitreten kann eine vorwärtsgerichtete Behauptung regulären Ausdruck zu konstruieren:

>>> list_of_words = ['a', 'boo', 'blah'] 

>>> reg = re.compile(r'^(?=.*\b(?:' + "|".join(list_of_words) + r')\b).*foo') 

>>> print reg.pattern 
^(?=.*\b(?:a|boo|blah)\b).*foo 

>>> reg.findall(r'abcd foo blah') 
['abcd foo'] 

Wie Sie sehen können, haben wir eine Regex ^(?=.*\b(?:a|boo|blah)\b).*foo konstruiert, die das Vorhandensein eines Wortes von list_of_words bestätigt und mit foo übereinstimmt.

+0

Danke! Können Sie mir bitte erklären, wie dieses Muster funktioniert? Wie ignoriert man die Reihenfolge der Wörter und foo? –

+0

Es ignoriert die Liste der Wörter nicht. Unter Verwendung von Lookahead wird das Vorhandensein eines beliebigen Wortes aus "list_of_words" in der gegebenen Eingabe behauptet. [Lesen Sie mehr über Vorschau] (http://www.regular-expressions.info/lookaround.html) – anubhava

+0

Ich versuchte zu sehen, was alles in diesem Regex bedeutet, aber hier ist, was ich nicht verstehe: Warum wir Brauchen Sie das '^' am Anfang? Oder ist es nur eine gute Übung? Warum brauchen wir die Wortgrenze '\ b'? Was macht der '(?:' Teil?? Sorry, ich weiß, ich stelle viele Fragen, aber ich würde gerne verstehen, warum wir jeden Schritt der Regex machen, damit ich es verstehen kann. –