我一直在尝试自学 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]
I get:
$500.01
如何让正则表达式返回带小数部分和不带小数部分的值?
Thanks.
使用非捕获组:
result = re.findall( r'\$[0-9]+(?:\.[0-9][0-9])?', inputstring)
^^
The re.findall https://docs.python.org/2/library/re.html#re.findall函数返回捕获文本的列表(如果模式中定义了任何文本),并且您的文本中也有一个。您需要通过将其转变为非捕获性来摆脱它。
re.findall(模式、字符串、标志=0)
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。
Update
您可以使用以下命令稍微缩短您的正则表达式限制量词 {2}
这需要前面的子模式恰好出现 2 次:
r'\$[0-9]+(?:\.[0-9]{2})?'
^^^
或者甚至更换[0-9]
with \d
:
r'\$\d+(?:\.\d{2})?'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)