我(?= (?:\d{5}|[A-Z]{2}))在python re示例中看到了一个正则表达式,并对的含义感到非常困惑?:。
我也看到了python doc,有解释:
(?:...)
非捕获版本的常规括号。匹配括号内的任何正则表达式,但是在执行匹配后或在模式中稍后引用后,无法检索到与该组匹配的子字符串。
谁能给我一个例子,并解释它为什么起作用,谢谢!
通常,括号会在正则表达式内创建一个“捕获”组:
regex = re.compile("(set|let) var = (\\w+|\\d+)")
print regex.match("set var = 12").groups()
Run Code Online (Sandbox Code Playgroud)
结果
('set', '12')
Run Code Online (Sandbox Code Playgroud)
稍后,您可以通过在匹配结果上调用.groups()方法来检索这些组。如您所见,括号内的所有内容均以“组”形式捕获。但是您可能并不关心所有这些群体。假设您只想查找第二组而不是第一组的内容。您需要使用第一组括号将“ get”和“ set”分组,但是可以通过在开头添加“?:”来关闭捕获:
regex = re.compile("(?:set|let) var = (\\w+|\\d+)")
print regex.match("set var = 12").groups()
Run Code Online (Sandbox Code Playgroud)
结果:
('12',)
Run Code Online (Sandbox Code Playgroud)
如果不需要组来捕获其匹配项,则可以将此正则表达式优化为 Set(?:Value)?。左括号后面的问号和冒号是创建非捕获组的语法。左括号后面的问号与正则表达式末尾的问号无关。最后一个问号是量词,它使前一个标记成为可选的。该量词不能出现在左括号之后,因为在组的开头没有任何内容可供选择。因此,作为使标记可选的运算符的问号与作为非捕获组语法的一部分的问号之间不存在歧义,尽管一开始可能会令人困惑。还有其他类型的组将 (? 语法与除冒号之外的其他字符结合使用,本教程稍后将对此进行解释。
color=(?:red|green|blue) 是另一个具有非捕获组的正则表达式。该正则表达式没有量词。
来自: http: //www.regular-expressions.info/brackets.html
另请阅读:什么是非捕获组?问号后跟冒号 (?:) 是什么意思?
| 归档时间: |
|
| 查看次数: |
5403 次 |
| 最近记录: |