【问题标题】:Matching multiple random optional regex expressions匹配多个随机可选正则表达式
【发布时间】:2013-02-18 21:45:15
【问题描述】:

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

例如,

s = '(pattern1)(pattern2)(pattern3)'

这样

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

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

match.groups()

总是以相同的顺序返回pattern1pattern2pattern3,即使一个或多个是None

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

【问题讨论】:

  • 您在寻找 s = 'pattern1|pattern2|pattern3' 管道分隔您的选项吗?

标签: python regex


【解决方案1】:

你是说

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

?

【讨论】:

    【解决方案2】:

    第一步阅读 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”的东西来获取结果

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多