其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

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

GG网络技术分享 2025-03-18 16:14 2


问题描述:

例如可以匹配一下数字: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位数字开头,但是结果却匹配的是逗号开始的一个数字

网友观点:

小括号在正则中有不同的含义
一种是指括号内的表达式作为一个整体,也就是你使用的这种,把 ,\\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())

(^\\,*\\d{3}\\,)*(^\\,*\\d{3}\\,)

正则表达式字符匹配攻略

正则表达式是匹配模式,要么匹配字符,要么匹配位置。请记住这句话。

然而关于正则如何匹配字符的学习,大部分人都觉得这块比较杂乱。

毕竟元字符太多了,看起来没有系统性,不好记。本文就解决这个问题。

内容包括:

1. 两种模糊匹配

2. 字符组

3. 量词

4. 分支结构

5. 案例分析

1. 两种模糊匹配

如果正则只有精确匹配是没多大意义的,比如/hello/,也只能匹配字符串中的"hello"这个子串。

标签:

提交需求或反馈

Demand feedback