Python 菜鸟求助正则表达式中的(?:...)用法
在 python 核心编程中看到这样一个例子: ''' print re.findall('http://(?:\w+.)(\w+.com)', 'http://code.google.com') ''' 最后的结果是输出['google.com']. 请问为什么前面的 http://没有掉了,求助...
Python 菜鸟求助正则表达式中的(?:...)用法
正则的()是捕获匹配,会返回的,其他的不会返回给你
正则里的(?:...)是个非捕获分组,简单说就是它把括号里的内容当做一个整体来匹配,但不会单独“记住”这个匹配结果。
看个例子就明白了。假设我要匹配abc123或def456这种模式,用普通分组:
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)只负责匹配abc或def,但不会出现在结果里,只有后面的(\d+)被捕获了。
什么时候用?
- 当你需要分组但不需要单独提取这个分组时
- 配合量词使用,比如
(?:ab)+匹配连续的ab - 提高一点点性能(虽然通常不明显)
简单总结:需要分组但不想要捕获结果时就用它。
建议楼主 查询一下 ?: 的意思
因为没有在括号里
(?:pattern)
匹配 pattern,但不捕获匹配结果。
顺手学了个新东西,感谢
原来这就是子组…另外这里有写错没有给.加上反斜杠没人看见吗…嘎嘎
()= 分组匹配 = 捕获组
即只会返回括号内的内容
(?:)只匹配不显示
(?:\w+.) 这句匹配到了" code. "只匹配不显示
(\w+.com)’ 这句匹配 google.com 并显示出来
- 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’)) 这样岂不美哉

