首先,我不是正则表达式的专家,一直依赖于this cookbook、this tool和this other tool
现在,当我尝试运行python2.7.7 64位win8时,它对这个示例文本没有任何作用
Two weeks ago I went shooing at target and spent USD1,010.53 and earned 300 points. When I checked my balance after I only had USD 1912.04.
请注意,美元与金额(1010.53美元)相连,第一种情况下,每千美元有一个逗号,但第二种情况下,美元与金额不相连,第千位(1912.04美元)没有逗号,在某些情况下,它们是整数,但不是货币,仍然需要解析(300分)。你知道吗
现在我终于弄到手了
^{2}$现在我有两个问题:
regex = re.compile('[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?\b|\.[0-9]+\b')
mynumerics = re.findall(regex,'The final bill is USD1,010.53 and you will earn 300 points. Thank you for shopping at Target')
我希望有三件事:
=>['1,010.53', '300', '1912.04']
或者更好
=>[1010.53, 300, 1912.04]
相反,我得到的只是一张空名单。我可能会尝试下载不同版本的python,但我知道我们部署的大多数产品都使用2.7.X,所以我希望这不是版本问题。你知道吗
两个主要问题:
re.findall
将返回一个元组列表,如果您的模式中有任何捕获组。由于您的模式以一种非常奇怪的方式使用组,因此您最终会看到一些奇怪的结果。通过使用(?:
而不是普通的(
括号来使用非捕获组。因为如果使用
\b
,您应该将模式字符串指定为带有r'string'
的原始字符串。实际上,所有regex都应该使用一个原始字符串来确保没有任何东西被奇怪地解析。考虑到这些因素,这个方法非常有效:
注意你的模式和我的模式之间的一些特殊差异。你知道吗
我明白有些方法超出了你的头脑,所以请评论,如果你需要澄清,我可以根据需要编辑。我建议查看一些其他regex参考和技巧,我个人喜欢this site,并且几乎虔诚地使用它来满足任何regex需求。你知道吗
编辑-匹配小数:
正如markdickinson巧妙地指出的,原始regex中的
|\.[0-9]+
是用来匹配.24
(简单小数)之类的东西的。我将该部分添加回中,并将其添加到匹配字符串中以显示功能。你知道吗暗影游侠的重要评论
侧注:这个模式,如所写,将看到4400并返回400,或者a123并返回123。这是一个问题(不是@RNar的,原来的模式也有同样的问题),因为如果4400应该被忽略,那么你就不应该得到它的一部分(只是在前面添加\b会导致其他问题,所以比这更难),而且因为English digit grouping rules allow the omission of the comma when the value is four digits to the left of the decimal, between 1000 and 9999,所以你不会像写的那样匹配它们
你能试试这个正则表达式吗?你知道吗
https://regex101.com/r/qN0gV9/1
相关问题 更多 >
编程相关推荐