正则表达式捕获组的可选顺序

时间:2018-05-22 08:55:53

标签: python regex python-3.x regex-group

我有关于正则表达式(在python中使用)的简单但棘手的问题,我在谷歌的任何地方都找不到答案。是否有任何“技巧”如何以可选顺序制作两个捕获组?假设我们有以下内容:

.*abc.*

我想要的是同样匹配:

.*acb.*

我知道我可以使用

.*abc|acb.*

但问题是,如果我们有比abc更复杂的东西,那么代码就很长。没有任何解决方法可以说明,例如“以任何顺序匹配最后两个捕获组(或符号等)?

2 个答案:

答案 0 :(得分:2)

我真的不知道这个任何顺序的东西会使正则表达式更短。另一方面,即使你有很多选择,我也可以向你展示如何使这个可读。

import re
pattern = """
.*      # match from starting the line
(?:     # A non-capturing group starts so we can list lots of alternatives
abc|    # alternative 1
acb     # alternative 2
)       # end of alternatives
.*      # then match everything up to the end of the line
"""
re.search(pattern, 'qqabcqq', re.VERBOSE) # returns a match
re.search(pattern, 'qqacbqq', re.VERBOSE) # returns a match
re.search(pattern, 'qqaSDqq', re.VERBOSE) # does not return a match

那么我们在这里看到的是什么?

""" ... """构造是在python中定义多行字符串的便捷方式。

然后re.VERBOSE跳过空白和评论。正如the manual says

  

模式中的空格被忽略,除非在角色中   类或在前面有未转义的反斜杠。如果一行包含一个不在字符类中的#并且前面没有未转义的反斜杠,那么从最左边的#到行尾的所有字符都将被忽略。

这两件事让您可以为正则表达式添加结构和注释。 Here是另一个很好的例子。

答案 1 :(得分:0)

使用标准正则表达式,您可以定义无顺序的模式。例如:

[cdgjow]

当然这个例子指的是字符。

必须使用" |"指定替代序列。例如:

abc|cba

无法用经典正则表达式语法表达您想要表达的内容。正则表达式语法没有语法元素来表达您想要表达的内容。它缺乏此功能。你必须依靠"手动"指定你的选择。它不是由正则表达式构造的自动机的限制,而是正则表达式语法本身的限制。

这意味着:您必须自己构建所需的正则表达式,并尽可能使用所有变体。有两种方法可以做到这一点:

  • 手动完成。花点时间,小心,手动构建正确的正则表达式。
  • 以编程方式执行。编写一些生成所需正则表达式的代码。

如果你手动考虑@TamasRev答案。 (谢谢@TamasRev!很好的答案!)但如果我是你,我会以编程方式构建正则表达式。 (无论如何,已经发明了编程这样的东西:-))