我有一个模式列表,比如
list_patterns = [': error:', ': warning:', 'cc1plus:', 'undefine reference to']
我想做的是生成所有这些元素的联合,生成一个正则表达式,匹配 list_patterns
中的每个元素 [但可能不匹配任何不在 list_patterns 中的 re -- msw]
re.compile(list_patterns)
这可能吗?
最佳答案
有几种方法可以做到这一点。最简单的是:
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()
传递每个模式以转义任何正则表达式特殊字符。
现在您使用哪一个取决于您的模式列表。它们是正则表达式,因此可以假定它们是有效的吗?如果是这样,第一个可能是合适的。如果是字符串,使用第二种方法。
首先,它变得更加复杂,因为通过连接几个正则表达式,您可能会更改分组并产生其他意想不到的副作用。
关于Python:定义正则表达式的并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3274027/