Matt
Matt

Reputation: 982

Python regular expression not matching

This is one of those things where I'm sure I'm missing something simple, but... In the sample program below, I'm trying to use Python's RE library to parse the string "line" to get the floating-point number just before the percent sign, i.e. "90.31". But the code always prints "no match".

I've tried a couple other regular expressions as well, all with the same result. What am I missing?

#!/usr/bin/python
import re
line = '    0 repaired, 90.31% done'
pct_re = re.compile(' (\d+\.\d+)% done$')
#pct_re = re.compile(', (.+)% done$')
#pct_re = re.compile(' (\d+.*)% done$')
match = pct_re.match(line)
if match: print 'got match, pct=' + match.group(1)
else: print 'no match'

Upvotes: 23

Views: 36895

Answers (3)

Conan Li
Conan Li

Reputation: 494

try this if you really want to use match:

re.match(r'.*(\d+\.\d+)% done$', line)

r'...' is a "raw" string ignoring some escape sequences, which is a good practice to use with regexp in python. – kratenko (see comment below)

Upvotes: 2

Rohit Jain
Rohit Jain

Reputation: 213263

You should use re.findall instead:

>>> line = '    0 repaired, 90.31% done'
>>> 
>>> pattern = re.compile("\d+[.]\d+(?=%)")
>>> re.findall(pattern, line)
['90.31']

re.match will match at the start of the string. So you would need to build the regex for complete string.

Upvotes: 8

Daniel Roseman
Daniel Roseman

Reputation: 599610

match only matches from the beginning of the string. Your code works fine if you do pct_re.search(line) instead.

Upvotes: 46

Related Questions