python—什么是正则表达式模式,它匹配从最左边的逗号到最后一个整数的逗号分隔数字部分

zvokhttg  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(398)

给定一个逗号分隔的数字 "123,456,789" 作为一个字符串,我试图构建一个正则表达式模式,该模式匹配(包括)最左边的逗号 ',' 至最后一个整数(单位位值)位 '9' . 对于上面字符串中的数字, ",456,789" 应该是匹配的。
我的代码如下:

import re
print(re.findall(r"(,\d{3})*", "123,456,789"))

# The above regular expression pattern is actually part of a much larger

# regular expression pattern to match a number that may or may not be

# comma delimited or be in scientific notation. The pattern is:

# r"([-+]?\d+){1}(,\d{3})*(\.\d+)?([Ee][+-]?([-+]?\d+){1}(,\d{3})*)?"

但是,上面的代码会产生一个逻辑错误,其中只返回最小(非贪婪)最右边的匹配。结果如下:

In [0]: print(re.findall(r"(,\d{3})*", "123,456")) # Expected output: ',456'
Out[0]: [',456', '']

In [1]: print(re.findall(r"(,\d{3})*", "123,456,789")) # Expected output: ',456,789'
Out[1]: [',789', '']

In [2]: print(re.findall(r"(,\d{3})*", "123,456,789,000")) # Expected output: ',456,789,000'
Out[2]: [',000', '']

请帮我找出我的错误。

cx6n0qe3

cx6n0qe31#

使用字符串\a的regex start仅查找第一个匹配项。

number = '123,456,789'
all_after_first_comma = re.sub('\A\d{1,3},', ',', number)

要得到'456789'

lf3rwulv

lf3rwulv2#

您只需添加一个 ?: 到您的模式以抑制子组,使模式 (?:,\d{3})* :

import re

for result in filter(None, re.findall("(?:,\d{3})*", "123,456,789")):
    print(result)

输出:

,456,789

这个 filter 有一种方法可以过滤掉空字符串。

相关问题