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

时间:2015-02-03 08:21:43

标签: python regex python-3.x

我有一个正则表达式从类似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)

2 个答案:

答案 0 :(得分:3)

您只需要转义中间的|符号,以便它与文字|符号匹配,否则它将执行正则表达式OR运算。字符类中的|会松散它的特殊含义,只匹配文字|符号。但是字符类之外的未转义|符号就像alternation operator一样。

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

DEMO

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


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

答案 1 :(得分:1)

放入|在非捕获组内:

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

正如Avinash指出的那样,逃避|,结果将是:

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