2013-07-16 85 views
7

这是我确信我错过简单的东西之一,但是......在下面的示例程序中,我试图使用Python的RE库来解析字符串“行“来获取百分号前面的浮点数,即”90.31“。但代码总是打印“不匹配”。Python正则表达式不匹配

我已经尝试了其他正则表达式以及所有具有相同结果。我错过了什么?

#!/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' 
+0

我知道这是件小事!感谢大家的快速和有益的答复。 – Matt

回答

15

match只从字符串的开始匹配。您的代码可以正常工作,如果您改为使用pct_re.search(line)

4

您应该使用re.findall代替:

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

re.match将匹配字符串的开始。所以你需要为完整的字符串构建正则表达式。

2

试试这个,如果你真的想用比赛:

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

R“...”是一个‘原始’的字符串忽略一些转义序列,这是用Python正则表达式使用一个很好的做法。 - kratenko(见下面的评论)

+0

你可能想补充说,'r'...''是一个忽略某些转义序列的“原始”字符串,这是一个很好的习惯,可以在python中与regexp一起使用。 – kratenko