本文翻译自:https://docs.python.org/3.4/howto/regex.html
博主对此做了一些注明和修改 ^_^
非捕获组和命名组
精心设计的正则表达式可能划分很多组,这些组不仅可以匹配相关的子串,还能够对正则表达式本身进行分组和结构化。在复杂的正则表达式中,由于有太多的组,因此通过组的序号来跟踪和使用变得困难。有两个新的功能可以帮你解决这个问题——非捕捕获组和命名组——它们都使用了一个公共的正则表达式扩展语法。我们先来看看这个表达式扩展语法是什么。
正则表达式的扩展语法
众所周知,Perl5 为标准的正则表达式增加了许多强大的功能。Perl 的开发者们并不能选择一个新的元字符或者通过反斜杠构造一个新的特殊序列来实现扩展功能。因为这样会和标准的正则表达式发生冲突。比如你想选择 & 作为扩展功能的元字符(在标准正则表达式中,& 没有意义),但这样的话,已经按照标准语法写出来的正则表达式就不得不修改,因为它们中包含的 '&' 意愿上只是把它当做普通字符匹配而已。
注:看起来很是头疼的兼容性问题,Perl 的开发者们是如何解决的呢?请接着看......
最终,Perl 的开发者们决定使用 (?...) 作为扩展语法。问号 ? 紧跟在左小括号 ( 后边,本身是一个语法错误的写法,因为 ? 前边没有任何东西可以重复,所以这样就解决了兼容性的问题(理由是语法正确的正则表达式肯定不会这么写嘛~)。然后,紧跟在 ? 后边的字符则表示哪些扩展语法会使用。例如 (?=foo) 表示一种新的扩展功能(前向断言),(?:foo) 则表示另一种扩展功能(一个包含子串 foo 的非捕获组)。
Python 支持 Perl 的一些扩展语法,并且在此基础上还增加了一个扩展语法。如果紧跟在问号 ? 后边的是 P,那么可以肯定这是一个 Python 的扩展语法。
好,既然我们已经知道了如何对正则表达式的标准语法进行扩展,那我们回来看看这些扩展语法在复杂的正则表达式中是如何应用的。
非捕获组
第一个我们要讲的是非捕获组。有时候你只是需要用一个组来表示部分正则表达式,你并不需要这个组去匹配任何东西,这时你可以通过非捕获组来明确表示你的意图。非捕获组的语法是 (?...),这个 ... 你可以替换为任何正则表达式。
注:“捕获”就是匹配的意思啦,普通的子组都是捕获组,因为它们能从字符串中匹配到数据。
除了你不能