0

是否可以以任何顺序将多个可选正则表达式与字符串匹配(但可以按特定顺序检索?)

例如,

s = '(模式1)(模式2)(模式3)'

这样

match = re.search(s, 'pattern2 pattern1')
match = re.search(s, 'pattern1 pattern3 pattern2')
match = re.search(s, 'pattern3 pattern1')

以及所有其他排列匹配,此外

match.groups()

总是以相同的顺序返回pattern1, pattern2,pattern3即使有一个或多个None

我知道这听起来不太可能——只是想知道是否以及如何做到这一点。

4

2 回答 2

1

你的意思是

s = '(pattern1|pattern2|pattern3)'
match = sorted(re.findall(s, 'pattern1 pattern3 pattern2'))
match
>>> ['pattern1', 'pattern2', 'pattern3']

?

于 2013-02-18T21:58:47.097 回答
0

第一步阅读 itertools 的文档,看看 itertools 的魔法会生成你想要的匹配集。例如

>>> import itertools
>>> a=['aaa','bbb','ccc']
>>> for q in itertools.permutations(a):
...   print q
... 
('aaa', 'bbb', 'ccc')
('aaa', 'ccc', 'bbb')
('bbb', 'aaa', 'ccc')
('bbb', 'ccc', 'aaa')
('ccc', 'aaa', 'bbb')
('ccc', 'bbb', 'aaa')

为了确保以一致的方式返回匹配项,例如用 ?P 标记正则表达式的每个部分

>>> rl=[]
>>> bigr=""
>>> for q in itertools.permutations(a):
...   r=""
...   for ms in q:
...     r = r + "(?P<" + ms + ">" + ms + ")"
...   rl.append(r)
... 
>>> rl
['(?P<aaa>aaa)(?P<bbb>bbb)(?P<ccc>ccc)', '(?P<aaa>aaa)(?P<ccc>ccc)(?P<bbb>bbb)', '(?P<bbb>bbb)(?P<aaa>aaa)(?P<ccc>ccc)', '(?P<bbb>bbb)(?P<ccc>ccc)(?P<aaa>aaa)', '(?P<ccc>ccc)(?P<aaa>aaa)(?P<bbb>bbb)', '(?P<ccc>ccc)(?P<bbb>bbb)(?P<aaa>aaa)']

在上面的示例中,我使用匹配字符串作为表达式 P 部分中的 id 标记。您可以生成“name1”“name2”或类似的

最后,将所有的小正则表达式合并成一个巨大的正则表达式

onegiantregexp = "|".join(rl)

并使用类似 re 模块“groupdict”的东西来获得结果

希望这可以帮助

于 2013-02-18T22:09:10.337 回答