如何用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)
这一部分是匹配带有“,”的情况,就不详细说了
就是不知道还有没有其他更简便的方式?
有的话,帮忙留言给我,请大家多多赐教