与re.findall一起使用时,Python正则表达式返回匹配的一部分

Jor*_* H. 5 python regex findall

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

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

这是文本建议的内容:

\$[0-9]+(\.[0-9][0-9])?
Run Code Online (Sandbox Code Playgroud)

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

import re

inputstring = "$500.01"

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

if result:
    print(result)
else:
    print("No match.")
Run Code Online (Sandbox Code Playgroud)

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

.01
Run Code Online (Sandbox Code Playgroud)

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

\$[0-9]+\.[0-9][0-9]
Run Code Online (Sandbox Code Playgroud)

我明白了:

$500.01
Run Code Online (Sandbox Code Playgroud)

如何使正则表达式返回带小数部分和不带小数部分的值?

谢谢.

Wik*_*żew 5

使用非捕获组:

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

如果模式中定义了任何捕获的文本,并且您的模式中有一个,则该re.findall函数将返回捕获的文本列表。您需要通过将其转变为非捕获性来摆脱它。

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

更新

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

r'\$[0-9]+(?:\.[0-9]{2})?'
                    ^^^
Run Code Online (Sandbox Code Playgroud)

或者甚至替换[0-9]\d

r'\$\d+(?:\.\d{2})?'
Run Code Online (Sandbox Code Playgroud)