如何用python写一个正则表达式,匹配每 3 位就有一个逗号的数字(千分号)?

这个是《Python编程快速上手 让繁琐工作自动化》正则表达式这一章的习题
下午摸索了半天,本身对正则不是特别了解,之前接触过一些,近几天学习python,又开始倒腾了
下面是我自己下午写的,请大家指导下

import re
threeNumRegex = re.compile(r'''
    (?:(?<![\d|\,])\d{1,3}(?=\s)) #匹配只有1-3位数,左边
    |
    (?<![\d|\,])(?:\d{1,3})(?:\,\d{3})+(?=\s) #匹配带有","的情况
''', re.VERBOSE)
text = '''
    12
    12,333
    12,12
    4444
    234,45,234
    873,238,23,222
    837,228,112
    2211,341,394,222
'''
result = threeNumRegex.findall(text)
print(result)

为什么是

(?:(?<![\d|\,])\d{1,3}(?=\s))|(?<![\d|\,])(?:\d{1,3})(?:\,\d{3})+(?=\s)

其中

(?<![\d|\,])\d{1,3}(?=\s)) 

是用来匹配只有1-3位数的情况,前面不能是数字或者",",如果没有前面的否定负向零宽断言

(?<![\d|\,])

就会出现下面这样的匹配情况

['12', '333', '12', '444', '234', '222', '112', '222']

得不到正确的结果
另外,还需要加一个肯定正向零宽断言

(?=\s)

如果不加,结果会是这样

['12', '12', '12', '444', '234', '873', '837', '221']

也不正确

(?<![\d|\,])(?:\d{1,3})(?:\,\d{3})+(?=\s)

这一部分是匹配带有“,”的情况,就不详细说了

就是不知道还有没有其他更简便的方式?
有的话,帮忙留言给我,请大家多多赐教

猜你喜欢

转载自blog.csdn.net/daaa2019/article/details/102963975
今日推荐