如何用python寫(xiě)一個(gè)正則表達(dá)式,匹配每 3 位就有一個(gè)逗號(hào)的數(shù)字(千分號(hào))?
這個(gè)是《Python編程快速上手 讓繁瑣工作自動(dòng)化》正則表達(dá)式這一章的習(xí)題
下午摸索了半天,本身對(duì)正則不是特別了解,之前接觸過(guò)一些,近幾天學(xué)習(xí)python,又開(kāi)始倒騰了
下面是我自己下午寫(xiě)的,請(qǐng)大家指導(dǎo)下
import re
threeNumRegex = re.compile(r'''
(?:(?<![\d|\,])\d{1,3}(?=\s)) #匹配只有1-3位數(shù),左邊
|
(?<![\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))
是用來(lái)匹配只有1-3位數(shù)的情況,前面不能是數(shù)字或者",",如果沒(méi)有前面的否定負(fù)向零寬斷言
(?<![\d|\,])
就會(huì)出現(xiàn)下面這樣的匹配情況
['12', '333', '12', '444', '234', '222', '112', '222']
得不到正確的結(jié)果
另外,還需要加一個(gè)肯定正向零寬斷言
(?=\s)
如果不加,結(jié)果會(huì)是這樣
['12', '12', '12', '444', '234', '873', '837', '221']
也不正確
(?<![\d|\,])(?:\d{1,3})(?:\,\d{3})+(?=\s)
這一部分是匹配帶有“,”的情況,就不詳細(xì)說(shuō)了
就是不知道還有沒(méi)有其他更簡(jiǎn)便的方式?
有的話(huà),幫忙留言給我,請(qǐng)大家多多賜教