2013-06-13 13 views
10

Chcę dopasować wszystkie wiersze w raporcie z testu, które zawierają wyrazy "Nie OK". Przykład linia tekstu:Python wyrażenie regularne pasujące do określonego słowa

'Test result 1: Not Ok -31.08' 

Próbowałem to:

filter1 = re.compile("Not Ok") 
for line in myfile:          
    if filter1.match(line): 
     print line 

który powinien działać według http://rubular.com/, ale nic nie mogę na wyjściu. Każdy pomysł, co może być nie tak? Przetestowano różne inne parametry, takie jak "." i "^ Test", które działają doskonale.

+0

Dlaczego regex jeśli jest to specyficzny ciąg? Dlaczego nie "jeśli" nie jest OK "w linii:'? –

+0

BTW, 're.match()' pasuje tylko na początku łańcucha. –

+0

Byłem pewien, że mecz może nie tylko rozpocząć ciąg znaków .. czy $ nie powinno pasować do końca linii? – casper

Odpowiedz

24

Powinieneś użyć re.search tutaj nie re.match.

Z docs na re.match:

Jeśli chcesz zlokalizować meczu gdziekolwiek w ciągu, użyć wyszukiwania() zamiast.

Jeśli szukasz dokładnym słowem 'Not Ok' następnie użyć \b granicy słowa, inaczej jeśli tylko szukasz podciągu 'Not Ok' następnie wykorzystać prosty: if 'Not Ok' in string.

>>> strs = 'Test result 1: Not Ok -31.08' 
>>> re.search(r'\bNot Ok\b',strs).group(0) 
'Not Ok' 
>>> match = re.search(r'\bNot Ok\b',strs) 
>>> if match: 
...  print "Found" 
... else: 
...  print "Not Found" 
...  
Found 
+0

Rzeczywiście, działa to, nawet bez wszystkich dodatkowych \ b rzeczy. Dzięki! Odkryłem również, że w tym przypadku działał re.findall. – casper

+3

@casper bez '\ b' zwróci' True' dla czegoś takiego jak to: ''KNot Oke''. 're.findall' zwraca listę wszystkich nie pokrywających się dopasowań, dla celów sprawdzania' re.search' jest najlepszym wyborem. –

1

mógłby po prostu użyć,

if <keyword> in str: 
    print('Found keyword') 

Przykład:

if 'Not Ok' in input_string: 
    print('Found string') 
Powiązane problemy