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

Python regex returns a part of the match when used with re.findall

我一直在努力自学 Python,目前正在学习正则表达式。我一直在使用的说明文本似乎旨在教授 Perl 或其他一些不是 Python 的语言,因此我不得不稍微调整一下表达式以适应 Python。然而,我不是很有经验,而且我在尝试让表达式起作用时遇到了障碍。

该问题涉及在文本中搜索价格实例,以不带小数的 $500 或带小数的 $500.10 表示。

这是文字推荐的:

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

复制文本,我使用这个代码:

import re

inputstring = "0.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]

我得到:

0.01

如何将正则表达式设为 return 带小数部分和不带小数部分的值?

谢谢。

使用非捕获组:

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

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

re.findall(pattern, string, flags=0)
If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group.

更新

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

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

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

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