获取正则表达式子子组的值

Get value of a regex sub-subgroup

我有一个正则表达式可以从类似 wiki 的页面中提取 links:

for mo in re finditer(r"\[\[([^|\]]+)(|([^\]]+))?\]\]", page):

(wiki link 看起来像 [[link target]][[link target|text]]

匹配正常,但是,我找不到从第二部分的子子组中获取 text 的方法:[[(…)(|(I need the contents of this group))?]]

对于这样的 link,mo.groups() 的 return 值如下所示(第一行是该匹配项的输入):

"[[:Groups:Admins|Admins]]"
(':Groups:Admins', '|Admins', '|Admins')

我希望第 3 个元素是 Admins 而不是 |Admins

我知道我可以简单地切断管道字符(实际上这就是我现在正在做的),但是有没有 re 方法来做到这一点?

(我正在使用 Python 3.4.1)

你只需要转义中间的 | 符号,这样它就会匹配文字 | 符号,否则它会执行正则表达式或运算。 | 在字符 class 内会失去它的特殊含义,只匹配文字 | 符号。但是字符 class 之外的未转义 | 符号的作用类似于 alternation operator.

\[\[([^|\]]+)(\|([^\]]+))?\]\]
              ^
              |

DEMO

>>> s = "[[:Groups:Admins|Admins]]"
>>> for mo in re.finditer(r"\[\[([^|\]]+)(\|([^\]]+))?\]\]", s):
        mo.groups()


(':Groups:Admins', '|Admins', 'Admins')

把 |在非捕获组内:

r"\[\[([^|\]]+)(?:\|([^\]]+))?\]\]"

正如 Avinash 指出的那样,转义 |,结果将是:

(':Groups:Admins', 'Admins')