获取正则表达式子子组的值
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.
\[\[([^|\]]+)(\|([^\]]+))?\]\]
^
|
>>> s = "[[:Groups:Admins|Admins]]"
>>> for mo in re.finditer(r"\[\[([^|\]]+)(\|([^\]]+))?\]\]", s):
mo.groups()
(':Groups:Admins', '|Admins', 'Admins')
把 |在非捕获组内:
r"\[\[([^|\]]+)(?:\|([^\]]+))?\]\]"
正如 Avinash 指出的那样,转义 |,结果将是:
(':Groups:Admins', 'Admins')
我有一个正则表达式可以从类似 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.
\[\[([^|\]]+)(\|([^\]]+))?\]\]
^
|
>>> s = "[[:Groups:Admins|Admins]]"
>>> for mo in re.finditer(r"\[\[([^|\]]+)(\|([^\]]+))?\]\]", s):
mo.groups()
(':Groups:Admins', '|Admins', 'Admins')
把 |在非捕获组内:
r"\[\[([^|\]]+)(?:\|([^\]]+))?\]\]"
正如 Avinash 指出的那样,转义 |,结果将是:
(':Groups:Admins', 'Admins')