这是我之前的问题的继续,我想将许多模式编译为一个正则表达式,在讨论之后我做了类似的事情
REGEX_PATTERN = '|'.join(self.error_patterns.keys())
其中self.error_patterns.keys()
将是
: error:
: warning:
cc1plus:
undefine reference to
Failure:
并做
error_found = re.findall(REGEX_PATTERN,line)
现在当我针对某个可能包含一个或多个模式的文件运行它时,我怎么知道哪个模式完全匹配?我的意思是我无论如何都可以手动查看该行并找到它,但想知道在执行re.findall后我是否可以找到像re.group()之类的模式
谢谢
答案 0 :(得分:1)
re.findall
将返回与您的表达式匹配的所有文本部分。
如果这不足以明确地识别模式,您仍然可以针对您加入()ed的各个子模式执行第二次re.match / re.find。在应用初始正则表达式时,匹配器不再知道您已经将它组成了几个子模式,因此它无法提供子模式匹配的更详细信息。
另一个同样笨拙的选择是将每个模式封装在一个组(...)
中。然后,re.findall将返回None值的数组(对于所有不匹配的模式),但匹配模式的组除外。
答案 1 :(得分:1)
MatchObject具有lastindex
属性,其中包含参与匹配的最后一个捕获组的索引。如果将每个模式包含在自己的捕获组中,如下所示:
(: error:)|(: warning:)
... lastindex
将告诉您哪一个匹配(假设您知道模式在正则表达式中出现的顺序)。您可能希望使用finditer()
(创建MatchObjects的迭代器)而不是findall()
(返回字符串列表)。此外,请确保正则表达式中没有其他捕获组,以使索引不同步。