Python Regex - 使用“|”选择性地命名组('或'在正则表达式中)

时间:2017-02-15 10:50:53

标签: python regex

我正在使用python正则表达式来匹配模式和字符串,并且基于几个模板面临着命名组的问题。

简化后会出现写作问题;

pattern = r'(?P<one>1)|(?P<one>one)'
string = 'one'
re.match(pattern, string).groupdict()

我想将{'one': 1}{'one': 'one'}作为输出。 但是,这会引发错误;

error: redefinition of group name 'one' as group 2; was group 1 at position 15

一个更具体的例子: 我有一个字符串列表,每个字符串包含;

  • 前缀如'hello'
  • 此人的性别,
  • 他/她的生日
像这样;

['hello F 10/Feb', 'hello Jan/12 M', 'hi F Feb 15', ...]

等等。

他们似乎有多样性,但所有人都遵循其中一个模板;

  • 前缀+ [空格] +性别+ [空格] +天+'/'+月
  • 前缀+ [空格] +月+'/'+日+空格+性别
  • 前缀+ [空格] +性别+ [空格] +月份+ [空格] +天

所以我考虑使用正则表达式并使用re.match()将它们包含在字典中。

首先,我制作了一个用正则表达式编写的模板列表。

template = [
r'((?P<gender>[FM]) (?P<day>\d+)/(?P<month>\d+))',
r'((?P<month>.+)/(?P<month>\d+) (?P<gender>[FM]))',
r'((?P<gender>[FM]) (?P<month>.+)/(?P<day>\d))',]

在这里,我删除了问候语部分,因为它永远不会改变它的位置,因为出于可用性目的,我想将前缀部分保留为变量prefix

然后我尝试加入'|'这样的

prefix + r'|'.join(template)

在一个连接的字符串中生成正则表达式。

但是,当我尝试将其与正则表达式匹配时,我遇到了重新定义的错误。

我知道可以通过

来完成
for i in template:
    re.match(prefix + i, string)

有点什么,但如果可能的话,我想把模式字符串保持在一行。

这可能吗?

(我使用Python 3.5.2 | Anaconda 4.2.0(64位))

1 个答案:

答案 0 :(得分:1)

这是可能的,但不是标准的re模块。 您正在寻找的功能是分支重置组,允许重新定义组以进行不同的更改。这可用于编号组以及命名组。要在python中使用它,您可以使用PyPi Regex module

一般语法是(?|(.)|(.)),其中两个捕获组都编号为1,因为它们以不同的替换方式出现。同样可以用于命名组,因此您的示例可以写为(?|(?P<one>1)|(?P<one>one))

请参阅demo on regex 101

注意:这是使用PCRE模式,PCRE和正则表达式模块之间存在差异,但显示的功能由两者共享。