我一直在自学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如何使正则表达式返回带小数部分和不带小数部分的值?
谢谢。
发布于 2015-08-19 20:55:03
使用非捕获组:
result = re.findall( r'\$[0-9]+(?:\.[0-9][0-9])?', inputstring)
^^ 如果模式中有任何定义,则re.findall函数返回捕获文本的列表,并且您的模式中有一个文本。你需要通过把它变成非捕获的东西来摆脱它。
re.findall(模式,字符串,flags=0) 如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,则这将是一个元组列表。
更新
您可以通过使用限制量词{2}来稍微缩短正则表达式,该限定符要求前面的子模式恰好出现两次:
r'\$[0-9]+(?:\.[0-9]{2})?'
^^^甚至将[0-9]替换为\d
r'\$\d+(?:\.\d{2})?'https://stackoverflow.com/questions/32105484
复制相似问题