duke0522 发表于 2020-9-21 10:45:06

如何写一个正则表达式,匹配每3位数1个逗号的数字

本帖最后由 duke0522 于 2020-9-21 10:51 编辑

如果只是匹配‘42’,‘4,123’而不匹配‘12,34,567’,‘1234’。正则表达式为(r'^\d{1,3}(,\d{3})*$'),可以很好的匹配。
但是,如果从一篇很长的文章中提取这样的数字呢?比如'42sdf1,234ds6,368,745ds12,34,567sdfs1234'这样的字符串中,匹配正确的数字,我还没有想出很好的办法。
目前的思路是,将'42sdf1,234ds6,368,745ds12,34,567sdfs1234'中所有的含有逗号的数字字符串全部提取出来,形成一个列表,然后对列表中的项采用正则表达式(r'^\d{1,3}(,\d{3})*$')进行匹配。
如何提取'42sdf1,234ds6,368,745ds12,34,567sdfs1234'中所有含有逗号的数字字符串,哪位大神可以指导一下?
或者有更好的解决办法?

挥舞乾坤 发表于 2020-9-21 10:53:50

re.findall(r'\d+,[\d,]+','42sdf1,234ds6,368,745ds12,34,567sdfs1234')
是要这个结果吗

duke0522 发表于 2020-9-21 14:38:40

挥舞乾坤 发表于 2020-9-21 10:53
是要这个结果吗

不理想,其中的‘42’和‘1234’没有匹配

duke0522 发表于 2020-9-21 14:55:49

挥舞乾坤 发表于 2020-9-21 10:53
是要这个结果吗

我好像找到了一个方法,在你的基础上改进一下,re.findall(r'\d+,[\d,]+|\d+','42sdf1,234ds6,368,745ds12,34,567sdfs1234')

duke0522 发表于 2020-9-21 15:44:45

挥舞乾坤 发表于 2020-9-21 10:53
是要这个结果吗

写了一个,你看如何
import re

text = '42sdf1,234ds6,368,745ds12,34,567sdfs1234'
matches = []

findNumRegex = re.compile(r'\d+,[\d,]+|\d+')
numberList = findNumRegex.findall(text)

numRegex = re.compile(r'^\d{1,3}(,\d{3})*)
for number in numberList:
    mo = numRegex.search(str(number))
    try:
      matches.append(mo.group())
    except:
      pass
print(matches)   

除此之外,我还有一个问题,r'\d+,[\d,]+'中中括号是什么含义?

挥舞乾坤 发表于 2020-9-21 17:43:05

duke0522 发表于 2020-9-21 15:44
写了一个,你看如何

除此之外,我还有一个问题,r'\d+,[\d,]+'中中括号是什么含义?

re.findall(r'[\d,]+','42sdf1,234ds6,368,745ds12,34,567sdfs1234')


这样就行了,中括号里含义是数字或者逗号

duke0522 发表于 2020-9-22 14:43:10

挥舞乾坤 发表于 2020-9-21 17:43
这样就行了,中括号里含义是数字或者逗号

想把你的答案设置为最佳答案,不知道怎么弄了{:5_94:}

挥舞乾坤 发表于 2020-9-22 17:29:50

duke0522 发表于 2020-9-22 14:43
想把你的答案设置为最佳答案,不知道怎么弄了

因为你发的不是提问贴,应该设置不了最佳吧,下次发提问帖就可以了
页: [1]
查看完整版本: 如何写一个正则表达式,匹配每3位数1个逗号的数字