Python:定义正则表达式的并集

6 投票
6 回答
8061 浏览
提问于 2025-04-16 01:27

我有一组模式,比如:

list_patterns = [': error:', ': warning:', 'cc1plus:', 'undefine reference to']

我想做的是把这些模式合并成一个正则表达式,这个表达式可以匹配到list_patterns里的每一个元素,但应该不会匹配到不在list_patterns里的任何东西 -- msw

re.compile(list_patterns)

这样做可以吗?

6 个回答

3

怎么样呢

ptrn = re.compile('|'.join(re.escape(e) for e in list_patterns))

注意这里使用了 re.escape(),这是为了避免一些字符,比如 ()[]|.+* 等在某些字符串中出现时引发意外的问题。如果你需要这样做,就用这个;如果不需要,就可以跳过 escape()

这也取决于你打算如何使用这个表达式——是仅仅用来查找匹配的内容,还是想要把匹配到的组收集回来呢?

3

在编程中,有时候我们会遇到一些问题,像是代码运行不正常或者出现错误。这种情况下,我们可以去一些技术论坛,比如StackOverflow,去寻找解决方案或者向其他人提问。

在这些论坛上,很多人会分享他们的经验和解决方法。你可以看到其他程序员是如何解决类似的问题的,或者他们是如何理解某些技术概念的。

如果你在论坛上提问,记得把你的问题描述清楚,提供相关的代码和错误信息,这样其他人才能更好地帮助你。

总之,StackOverflow是一个很好的资源,可以帮助你解决编程中的各种问题,学习新知识,和其他程序员交流。

list_regexs = [re.compile(x) for x in list_patterns]
13

有几种方法可以做到这一点。最简单的方法是:

list_patterns = [': error:', ': warning:', 'cc1plus:', 'undefine reference to']
string = 'there is an : error: and a cc1plus: in this string'
print re.findall('|'.join(list_patterns), string)

输出结果:

[': error:', 'cc1plus:']

只要把你的搜索模式连接在一起不破坏正则表达式,这样做是没问题的(比如其中一个模式里包含了正则表达式的特殊字符,比如左括号)。你可以这样处理:

list_patterns = [': error:', ': warning:', 'cc1plus:', 'undefine reference to']
string = 'there is an : error: and a cc1plus: in this string'
pattern = "|".join(re.escape(p) for p in list_patterns)
print re.findall(pattern, string)

输出结果是一样的。不过这样做的好处是把每个模式都通过 re.escape() 处理,来转义任何正则表达式的特殊字符。

现在你使用哪种方法取决于你的模式列表。它们是正则表达式吗?如果是的话,可以认为它们是有效的,那么第一种方法可能更合适。如果它们是普通字符串,那就用第二种方法。

不过对于第一种方法来说,事情会变得更复杂,因为把几个正则表达式连接在一起可能会改变分组,导致其他意想不到的副作用。

撰写回答