16

这是我确定我错过了一些简单的事情之一,但是......在下面的示例程序中,我正在尝试使用 Python 的 RE 库来解析字符串“line”以获取浮点百分号前的数字,即“90.31”。但代码总是打印“不匹配”。

我也尝试了其他几个正则表达式,结果都一样。我错过了什么?

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

3 回答 3

32

match仅从字符串的开头匹配。如果您这样做,您的代码可以正常工作pct_re.search(line)

于 2013-07-16T15:23:15.163 回答
7

您应该re.findall改用:

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

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

于 2013-07-16T15:24:09.563 回答
2

如果你真的想使用匹配,试试这个:

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

r'...' 是忽略一些转义序列的“原始”字符串,这是在 python 中与正则表达式一起使用的好习惯。– kratenko(见下面的评论)

于 2013-07-16T15:25:46.887 回答