weixin_45115418
weixin_45115418
采纳率83.3%
2020-08-13 16:09

写一个正则表达式,匹配每3位就有一个逗号的数字

例如可以匹配一下数字:12 12,234 1,234 5,345,234
但是不能匹配一下数字:12,34,567 (逗号之间只有两位数字)1234(缺少逗号)
我写的代码如下:

import re
threeNumRegex = re.compile(r'^\d{1,3}(,\d{3})*$')
text = '837,234'
result = threeNumRegex.findall(text)
print(result)

结果却是这样的:

[',234']

想不明白为啥表达式里面明明限定了以1到3位数字开头,但是结果却匹配的是逗号开始的一个数字

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • jiamaRay 王二小丷 8月前

    小括号在正则中有不同的含义
    一种是指括号内的表达式作为一个整体,也就是你使用的这种,把 ,\d{3} 作为整体使用 * 匹配多个
    还有一种含义是捕获数据,也就是将括号内表达式匹配到的数据提取出来保存供内部反向引用或者外部提取,你这个表达式也用到了这种含义
    还有其他含义感兴趣可以看看

    我想到的你现在有两种解决方式

    1. 修改正则,改为下面这种, ?: 意思是不捕获括号内匹配到的数据
    ^\d{1,3}(?:,\d{3})*$
    
    1. 修改使用的函数 findall 返回的是匹配的子串列表,你的小括号有捕获的含义,所以它返回了符合条件的 (,\d{3}) 部分 match 返回的是Match对象,不匹配返回None,使用 group() 或者 group(0) 函数可以提取符合正则的整个字符串,groups()函数提取捕获子串(和 findall 函数返回值类似了,只是这边是元祖) ()需要注意 match 函数本身就是从首字母开始匹配的,所以正则中加不加 ^ 意思都是一样的
    result = threeNumRegex.match(text)
    print(result.group())
    
    点赞 2 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 8月前
    (^\,*\d{3}\,)*(^\,*\d{3}\,)
    
    点赞 1 评论 复制链接分享