Products
GG网络技术分享 2025-03-18 16:14 2
例如可以匹配一下数字:12 12,234 1,234 5,345,234
但是不能匹配一下数字:12,34,567 (逗号之间只有两位数字)1234(缺少逗号)
我写的代码如下:
import rethreeNumRegex = re.compile(r\'^\\d{1,3}(,\\d{3})*$\')
text = \'837,234\'
result = threeNumRegex.findall(text)
print(result)
结果却是这样的:
[\',234\']
想不明白为啥表达式里面明明限定了以1到3位数字开头,但是结果却匹配的是逗号开始的一个数字
小括号在正则中有不同的含义
一种是指括号内的表达式作为一个整体,也就是你使用的这种,把 ,\\d{3}
作为整体使用 *
匹配多个
还有一种含义是捕获数据,也就是将括号内表达式匹配到的数据提取出来保存供内部反向引用或者外部提取,你这个表达式也用到了这种含义
还有其他含义感兴趣可以看看
我想到的你现在有两种解决方式
?:
意思是不捕获括号内匹配到的数据^\\d{1,3}(?:,\\d{3})*$
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. 案例分析
如果正则只有精确匹配是没多大意义的,比如/hello/,也只能匹配字符串中的"hello"这个子串。
Demand feedback