webentwicklung-frage-antwort-db.com.de

Python: Eleganter Weg, um zu überprüfen, ob mindestens eine Regex in der Liste mit einer Zeichenfolge übereinstimmt

Ich habe eine Liste von Regexen in Python und einen String. Gibt es eine elegante Möglichkeit zu überprüfen, ob der mindestens eine Regex in der Liste mit der Zeichenfolge übereinstimmt? Mit elegant meine ich etwas Besseres, als einfach alle Regexes durchzugehen, sie mit der Zeichenfolge zu vergleichen und anzuhalten, wenn eine Übereinstimmung gefunden wird.

Grundsätzlich hatte ich diesen Code:

list = ['something','another','thing','hello']
string = 'hi'
if string in list:
  pass # do something
else:
  pass # do something else

Jetzt möchte ich einige reguläre Ausdrücke in der Liste haben und nicht nur Zeichenfolgen. Ich frage mich, ob es eine elegante Lösung gibt, um nach einer Übereinstimmung zu suchen, um if string in list: zu ersetzen.

Danke im Voraus.

47
houbysoft
import re

regexes = [
    "foo.*",
    "bar.*",
    "qu*x"
    ]

# Make a regex that matches if any of our regexes match.
combined = "(" + ")|(".join(regexes) + ")"

if re.match(combined, mystring):
    print "Some regex matched!"
72
Ned Batchelder
import re

regexes = [
    # your regexes here
    re.compile('hi'),
#    re.compile(...),
#    re.compile(...),
#    re.compile(...),
]

mystring = 'hi'

if any(regex.match(mystring) for regex in regexes):
    print 'Some regex matched!'
81
nosklo

Eine Mischung aus Neds und Nosklos Antworten. Funktioniert garantiert für jede Länge der Liste ... Ich hoffe, Sie genießen

import re   
raw_lst = ["foo.*",
          "bar.*",
          "(Spam.{0,3}){1,3}"]

reg_lst = []
for raw_regex in raw_lst:
    reg_lst.append(re.compile(raw_regex))

mystring = "Spam, Spam, Spam!"
if any(compiled_reg.match(mystring) for compiled_reg in reg_lst):
    print("something matched")
4
Anderas

Hier ist, was ich basierend auf den anderen Antworten gewählt habe:

raw_list = ["some_regex","some_regex","some_regex","some_regex"]
reg_list = map(re.compile, raw_list)

mystring = "some_string"

if any(regex.match(mystring) for regex in reg_list):
    print("matched")
1
user5056973

Wenn Sie die Strings in einer Schleife ausführen, ist die Zeitkomplexität O (n). Ein besserer Ansatz wäre, diese Regex als Regex-Trie zu kombinieren.

0
ospider