2012-01-17 10 views

Odpowiedz

20

Możesz użyć wbudowanych funkcji, jeśli wszystkie wyrażenia regularne muszą się zgadzać) i wyrażenia Generatora, aby przeglądać wszystkie obiekty regex.

any (regex.match(line) for regex in [regex1, regex2, regex3])

(lub any(re.match(regex_str, line) for regex in [regex_str1, regex_str2, regex_str2]) jeśli Wyrażenia regularne nie są wstępnie skompilowane regex obiektów, oczywiście)

Mimo, że będzie ineficient porównaniu do łączenia swoich regexes w jednym wyrażeniu - jeśli ten kod jest czas lub procesora krytycznego, powinieneś spróbować, tworząc pojedyncze wyrażenie regularne, które obejmuje wszystkie twoje potrzeby, używając specjalnego operatora regex | do oddzielania oryginalnych wyrażeń. w prosty sposób połączyć wszystkie regexs jest użycie znaków „join” operator:

re.match("|".join([regex_str1, regex_str2, regex_str2]) , line)

Chociaż łączenie regexes w tej formie może doprowadzić do niewłaściwych wyrażeń czy oryginalne już robią używania Operator |.

+2

Możesz spowodować, że metoda łączenia będzie mniej podatna na niepowodzenie, jeśli zawiniesz każde wyrażenie w nawiasach. ''(' + ') | ('. join (['foo', 'bar', 'baz']) + ')' 'daje'' (foo) | (bar) | (baz) ''. – FakeRainBrigand

+3

Jeszcze lepiej, owinąć '(?: ...)' i połączyć łańcuch w sposób, który podkreśla jego logiczną strukturę. ''|' .join ('(?: {0})'. format (x) dla xw (" foo "," bar "," baz "))' na przykład. –

+0

Pracowałem dla mnie .... Dzięki – Prateek

1

Wypróbuj nowe wyrażenie: (regex1) | (regex2) | (regex3). Spowoduje to dopasowanie linii do któregokolwiek z 3 wyrażeń regularnych w tym wierszu.

+1

'(?: ...)' jest prawdopodobnie lepszym pomysłem niż '(...)' tutaj, aby uniknąć tworzenia fałszywych grup przechwytywania. –

+1

@Karl ... chyba że chcesz sprawdzić prawidłowość '.group (n)', aby określić * którą * grupę przechwyciłeś. –

1

Pętli przez elementy regex i wyszukiwania.

regexList = [regex1, regex2, regex3] 

line = 'line of data' 
gotMatch = False 
for regex in regexList: 
    s = re.search(regex,line) 
    if s: 
     gotMatch = True 
     break 

if gotMatch: 
    doSomething() 
Powiązane problemy