我有关于正则表达式(在python中使用)的简单但棘手的问题,我在谷歌的任何地方都找不到答案。是否有任何“技巧”如何以可选顺序制作两个捕获组?假设我们有以下内容:
.*abc.*
我想要的是同样匹配:
.*acb.*
我知道我可以使用
.*abc|acb.*
但问题是,如果我们有比abc更复杂的东西,那么代码就很长。没有任何解决方法可以说明,例如“以任何顺序匹配最后两个捕获组(或符号等)?
答案 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!很好的答案!)但如果我是你,我会以编程方式构建正则表达式。 (无论如何,已经发明了编程这样的东西:-))