python正则表达式中的?:符号

未来已来2018-09-06 09:43

作者:刘杰


正则表达式中的非捕获型括号和捕获型括号

在python中写邮箱正则表达式时候无意看到了“?:”符号,

p1=re.compile('[^\._-][\w\.-]+@(?:[A-Za-z0-9]+\.)+[A-Za-z]+)
emailmatch = p1.match(email)

半天没看懂,后来查了一下,于是记录一下。

  • (pattern )是捕获型括号。 匹配pattern,匹配pattern并捕获结果,自动获取组号

  • (?: pattern)是非捕获型括号 匹配pattern,但不捕获匹配结果

捕获型就是通常写的带小括号正则表达式,可以使用组号(自左向右从1开始)获取匹配的字符串),例如:

print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group() #123abc456
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #456

使用非捕获型的写法即说明不记录该匹配的内容,即使用?:符号,申明了该括号不作为分组记录,组号向右边移动1,即右边的括号内容为组号1,当然group(0)不受影响,例如:

print re.search("(?:[0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456
print re.search("(?:[0-9]*)([a-z]*)([0-9]*)",a).group(1) #abc
print re.search("(?:[0-9]*)(?:[a-z]*)([0-9]*)",a).group(1) #456
print re.search("(?:[0-9]*)(?:[a-z]*)(?:[0-9]*)",a).group(1) #IndexError: no such group

作用

显而易见,带非捕获型括号的正则表达式少存储结果,更省空间,其他作用无。

网易云大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者刘杰授权发布