python正则表达式和visualstudio代码正则表达式之间的区别



我使用python 3.7和重新库在类似的csv文件中查找值

23,"1,309",0
23,"134,799",2
,"1,549,089",0
8908.89,"27,989",3

我想要提取的值是用双引号和逗号作为千位分隔符包围的值。在此之前,我在VS代码搜索中测试了以下正则表达式:

"(d+,)?d+,d+"

这突出了正确的匹配。然而,当我在python中使用regex时:

regex = r'"(d+,)?d+,d+"'
re.findall(regex, text)

我得到了:

['', '', '1,', '']

最后,我能够通过使用以下表达式来获得正确的匹配:

regex = r'"d+,d+,d+|d+,d+"'

但我很想知道为什么第一个表达式在VSCode中有效,而在Python中无效。为什么会这样?

您的正则表达式对我来说还可以。更重要的是,它对我来说是有效的,但有一些限制。示例:

>>> import re
>>> r = re.compile(r'"(d+,)?d+,d+"')
>>> r.search(' blah "1,543" blah')
<re.Match object; span=(6, 13), match='"1,543"'>
>>> r.search('"31,999" blah')
<re.Match object; span=(0, 8), match='"31,999"'>

您可能应该展示您的代码,解释实际输出与预期输出的不同。

正如我上面所说的,正则表达式有一些限制:它不会匹配低于1000(没有逗号(或高于999999999(逗号太多(的数字。它会接受像"1,00"这样的无效数字,但与Visual Studio代码一起使用的版本有完全相同的限制,所以我认为这是经过深思熟虑的。

为了修复这些错误,我认为您需要一个子模式来匹配大于999的数字,并需要另一个子模式用于1.999:

>>> r = re.compile(r'"(d{1,3}(,d{3})+|d{1,3})"')

最新更新