我有一个正则表达式从类似wiki的页面中提取链接:
for mo in re finditer(r"\[\[([^|\]]+)(|([^\]]+))?\]\]", page):
(维基链接看起来像[[link target]]
或[[link target|text]]
匹配正常,但是,我找不到从第二部分的子子群中获取text
的方法:[[(…)(|(I need the contents of this group))?]]
此类链接的mo.groups()
返回值如下所示(第一行是此匹配的输入):
"[[:Groups:Admins|Admins]]"
(':Groups:Admins', '|Admins', '|Admins')
我希望第3个元素是Admins
而不是|Admins
。
我知道我可以简单地切掉管道角色(实际上这就是我现在正在做的事情),但有re
方法吗?
(我正在使用Python 3.4.1)
答案 0 :(得分:3)
您只需要转义中间的|
符号,以便它与文字|
符号匹配,否则它将执行正则表达式OR运算。字符类中的|
会松散它的特殊含义,只匹配文字|
符号。但是字符类之外的未转义|
符号就像alternation operator一样。
\[\[([^|\]]+)(\|([^\]]+))?\]\]
^
|
>>> s = "[[:Groups:Admins|Admins]]"
>>> for mo in re.finditer(r"\[\[([^|\]]+)(\|([^\]]+))?\]\]", s):
mo.groups()
(':Groups:Admins', '|Admins', 'Admins')
答案 1 :(得分:1)
放入|在非捕获组内:
r"\[\[([^|\]]+)(?:\|([^\]]+))?\]\]"
正如Avinash指出的那样,逃避|,结果将是:
(':Groups:Admins', 'Admins')