在执行re.findall之后查找正则表达式模式

时间:2010-07-30 18:43:16

标签: python regex

这是我之前的问题的继续,我想将许多模式编译为一个正则表达式,在讨论之后我做了类似的事情

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()之类的模式

谢谢

2 个答案:

答案 0 :(得分:1)

re.findall将返回与您的表达式匹配的所有文本部分。

如果这不足以明确地识别模式,您仍然可以针对您加入()ed的各个子模式执行第二次re.match / re.find。在应用初始正则表达式时,匹配器不再知道您已经将它组成了几个子模式,因此它无法提供子模式匹配的更详细信息。

另一个同样笨拙的选择是将每个模式封装在一个组(...)中。然后,re.findall将返回None值的数组(对于所有不匹配的模式),但匹配模式的组除外。

答案 1 :(得分:1)

MatchObject具有lastindex属性,其中包含参与匹配的最后一个捕获组的索引。如果将每个模式包含在自己的捕获组中,如下所示:

(: error:)|(: warning:)

... lastindex将告诉您哪一个匹配(假设您知道模式在正则表达式中出现的顺序)。您可能希望使用finditer()(创建MatchObjects的迭代器)而不是findall()(返回字符串列表)。此外,请确保正则表达式中没有其他捕获组,以使索引不同步。