19

I want to match all lines in a test report, which contain words 'Not Ok'. Example line of text :

'Test result 1: Not Ok -31.08'

I tried this:

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

which should work according to http://rubular.com/, but I get nothing at the output. Any idea, what might be wrong? Tested various other parameters, like "." and "^Test" , which work perfectly.

casper
  • 1,391
  • 2
  • 16
  • 29

3 Answers3

41

You should use re.search here not re.match.

From the docs on re.match:

If you want to locate a match anywhere in string, use search() instead.

If you're looking for the exact word 'Not Ok' then use \b word boundaries, otherwise if you're only looking for a substring 'Not Ok' then use simple : 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
Ashwini Chaudhary
  • 244,495
  • 58
  • 464
  • 504
  • indeed, this works, even without all extra \b stuff. Thanks! I also found that re.findall worked in this case. – casper Jun 13 '13 at 15:00
  • 4
    @casper without `\b` it'll return `True` for something like this as well: `'KNot Oke'`. `re.findall` returns a list of all non-overlapping matches, for checking purpose `re.search` is the best choice. – Ashwini Chaudhary Jun 13 '13 at 15:01
6

You could simply use,

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

Example:

if 'Not Ok' in input_string:
    print('Found string')
FelixSFD
  • 6,052
  • 10
  • 43
  • 117
Tej91
  • 131
  • 1
  • 2
  • 8
2

Absolutely no need to use RegEx in this case! Just use:

s = 'Test result 1: Not Ok -31.08'
if s.find('Not Ok') > 0 : 
    print("Found!")

or as already mentioned:

if 'Not Ok' in s:
    print("Found!")
not2qubit
  • 14,531
  • 8
  • 95
  • 135