与re.findall

时间:2015-08-19 20:53:13

标签: python regex findall

我一直在尝试自学Python,目前正在使用正则表达式。我一直在使用的教学文本似乎旨在教Perl或其他非Python语言,所以我不得不调整表达式以适应Python。然而,我并不是很有经验,而且我试图让表达变得有效。

问题涉及在文本中搜索价格实例,表示无小数,500美元或小数,500.10美元。

这是文本建议的内容:

\$[0-9]+(\.[0-9][0-9])?

复制文本,我使用此代码:

import re

inputstring = "$500.01"

result = re.findall( r'\$[0-9]+(\.[0-9][0-9])?', inputstring)

if result:
    print(result)
else:
    print("No match.")

然而,结果不是$ 500.01,而是:

.01

我发现这很奇怪。如果我删除括号和可选的小数部分,它可以正常工作。所以,使用这个:

\$[0-9]+\.[0-9][0-9]

我明白了:

$500.01

如何让正则表达式返回包含和不包含小数部分的值?

感谢。

1 个答案:

答案 0 :(得分:4)

使用非捕获组:

result = re.findall( r'\$[0-9]+(?:\.[0-9][0-9])?', inputstring)
                                ^^ 

re.findall函数返回捕获的文本列表(如果模式中有任何已定义的文本),并且您的文本中有一个。你需要通过把它变成一个非捕获它来摆脱它。

  

re.findall(pattern,string,flags = 0)   
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

<强>更新

您可以使用限制量词 {2}来缩短正则表达式,这需要前两个子模式恰好出现两次:

r'\$[0-9]+(?:\.[0-9]{2})?'
                    ^^^

甚至用[0-9]替换\d

r'\$\d+(?:\.\d{2})?'