Python 菜鸟求助正则表达式中的(?:...)用法

在 python 核心编程中看到这样一个例子: ''' print re.findall('http://(?:\w+.)(\w+.com)', 'http://code.google.com') ''' 最后的结果是输出['google.com']. 请问为什么前面的 http://没有掉了,求助...


Python 菜鸟求助正则表达式中的(?:...)用法

13 回复

正则的()是捕获匹配,会返回的,其他的不会返回给你


正则里的(?:...)是个非捕获分组,简单说就是它把括号里的内容当做一个整体来匹配,但不会单独“记住”这个匹配结果。

看个例子就明白了。假设我要匹配abc123def456这种模式,用普通分组:

import re

text = "abc123 def456"
pattern = r'(abc|def)(\d+)'  # 两个捕获分组
matches = re.findall(pattern, text)
print(matches)  # 输出:[('abc', '123'), ('def', '456')]

这里(abc|def)(\d+)都会单独捕获结果。

现在用非捕获分组:

pattern = r'(?:abc|def)(\d+)'  # 非捕获分组 + 捕获分组
matches = re.findall(pattern, text)
print(matches)  # 输出:['123', '456']

看到区别了吗?(?:abc|def)只负责匹配abcdef,但不会出现在结果里,只有后面的(\d+)被捕获了。

什么时候用?

  1. 当你需要分组但不需要单独提取这个分组时
  2. 配合量词使用,比如(?:ab)+匹配连续的ab
  3. 提高一点点性能(虽然通常不明显)

简单总结:需要分组但不想要捕获结果时就用它。

建议楼主 查询一下 ?: 的意思

因为没有在括号里

(?:pattern)

匹配 pattern,但不捕获匹配结果。

顺手学了个新东西,感谢

原来这就是子组…另外这里有写错没有给.加上反斜杠没人看见吗…嘎嘎

()= 分组匹配 = 捕获组

即只会返回括号内的内容

(?:)只匹配不显示

(?:\w+.) 这句匹配到了" code. "只匹配不显示
(\w+.com)’ 这句匹配 google.com 并显示出来

  1. help(‘re.findall’) Return a list of all non-overlapping matches in the string
    2. https://deerchao.net/tutorials/regex/regex.htm 匹配 exp,不捕获匹配的文本,也不给此分组分配组号

反正 . 也匹配 .

所以要怎么才能返回全部呢。比如我想要以 a 或者 b 开头加后面五个任意字符(a|b).{5}这样肯定不行,只能(a.{5}|b.{5}),但是。。。如果有 abcdefg 等等很多情况开头呢,又或者后面相同的条件也很长。。。


([a-z].{5})

把你想返回的部分加个括号就行了,返回整个匹配就加到最外面,另外表达式里没出现括号好像也是返回整个匹配。



import re
print(re.findall(’\w+\d+’, ‘abcdefg12345’)) 这样岂不美哉

回到顶部