weixin_45115418 2020-08-13 16:09 采纳率: 80%
浏览 850
已采纳

写一个正则表达式,匹配每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条回答 默认 最新

  • 王二小丷 2020-08-14 09:57
    关注

    小括号在正则中有不同的含义
    一种是指括号内的表达式作为一个整体,也就是你使用的这种,把 ,\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())
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 宇视监控服务器无法登录
  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥15 DruidDataSource一直closing
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据