python2.7.7不使用RegEx

2024-05-17 07:15:30 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我不是正则表达式的专家,一直依赖于this cookbookthis toolthis 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}$

现在我有两个问题:

  1. Python不会为上面的regex和示例字符串返回任何值,但是工具会返回。你知道吗
  2. 正则表达式只会返回,如果每1000位有一个逗号,即美元1912.04最终返回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,所以我希望这不是版本问题。你知道吗


Tags: and工具版本reyou示例情况tool
2条回答

两个主要问题:

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

  • 因为如果使用\b,您应该将模式字符串指定为带有r'string'的原始字符串。实际上,所有regex都应该使用一个原始字符串来确保没有任何东西被奇怪地解析。

考虑到这些因素,这个方法非常有效:

>>> 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

我明白有些方法超出了你的头脑,所以请评论,如果你需要澄清,我可以根据需要编辑。我建议查看一些其他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,所以你不会像写的那样匹配它们

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

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

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

相关问题 更多 >