我正在使用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 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位))
答案 0 :(得分:1)
这是可能的,但不是标准的re模块。 您正在寻找的功能是分支重置组,允许重新定义组以进行不同的更改。这可用于编号组以及命名组。要在python中使用它,您可以使用PyPi Regex module。
一般语法是(?|(.)|(.))
,其中两个捕获组都编号为1,因为它们以不同的替换方式出现。同样可以用于命名组,因此您的示例可以写为(?|(?P<one>1)|(?P<one>one))
。
注意:这是使用PCRE模式,PCRE和正则表达式模块之间存在差异,但显示的功能由两者共享。