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条)

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格