Python 2.7.7 不支持 RegEx

Python 2.7.7 not working with RegEx

首先我不是正则表达式专业人士并且一直依赖 this cookbook, this tool and this other tool

现在,当我尝试 运行 它 python 2.7.7 64 位 win 8 它对这个示例文本什么都不做

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.

请注意,美元与金额 (USD1,010.53) 相连,在第一种情况下每千位有一个逗号,但在第二种情况下它没有与金额相连,千位没有逗号(1912.04 美元),在某些情况下,它们是一些整数而非货币的值,仍然需要解析。(300 点)。

现在我设法得到了这个

[0-9]{1,3}(,[0-9]{3})*(.[0-9]+)?\b|.[0-9]+\b

现在我有两个问题:

  1. Python 没有 return 上述正则表达式和示例字符串的任何值,但工具有。
  2. 正则表达式只会 return 如果每第 1000 个位置都有一个逗号,即 1912.04 美元最终在在线工具上 returning 912.04 不太确定如何让它接受两种情况的逗号和非逗号。

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。所以我希望这不是版本问题。

你能试试这个正则表达式吗?

((?:\d+,?)+\.?\d+)

https://regex101.com/r/qN0gV9/1

两个主要问题:

    如果您的模式中有任何捕获组,
  • re.findall 将 return 一个元组列表。由于您的模式以非常奇怪的方式使用组,因此您最终会看到一些奇怪的结果。通过使用 (?: 而不是简单的 ( 括号来使用非捕获组。

  • 因为如果使用 \b,您应该将模式字符串指定为带有 r'string' 的原始字符串。实际上,您所有的正则表达式都应该使用原始字符串以确保没有任何内容被奇怪地解析。

考虑到这些,这非常有效:

>>> regex = re.compile(r'[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. What about .25 and 123,456.12?')
>>> mynumerics
['1,010.53', '300', '.25', '123,456.12']

注意你的模式和我的模式之间的一些特殊差异。

r'[0-9]{1,3}(?:,[0-9]{3})*(?:\.[0-9]+)?\b|\.[0-9]+\b'
1             2             2         
 '[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?\b|\.[0-9]+\b'

1 - raw string
2 - non-capturing groups instead of capturing groups

我知道有些方法超出了您的理解范围,因此如果您需要说明请发表评论,我可以根据需要进行编辑。我建议查看其他一些正则表达式参考和技巧,我个人喜欢 this site 并且几乎虔诚地使用它来满足任何正则表达式需求。

编辑 - 匹配小数:

正如 Mark Dickinson 巧妙指出的那样,原始正则表达式中的 |\.[0-9]+ 用于匹配 .24(简单小数)之类的东西。我将该部分添加回去并添加到匹配的字符串中以显示功能。

来自 ShadowRanger 的重要评论

旁注:这种模式,如所写,将看到 4400 和 return 400,或 a123 和 return 123。这是一个问题(不是@RNar's,原始模式有同样的问题)因为如果应该忽略 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,所以你不会匹配那些写的