正则表达式严格匹配结尾不同的两行

时间:2019-05-22 22:26:56

标签: python regex

我正在尝试匹配日志文件的以下文本:

2019-05-22 03:40:01 INFO  ReporteClaro:194 - Termino de procesar archivo

2019-05-22 03:40:01 INFO  ReporteClaro:208 - Termino de procesar Transaction Report

除了末尾(archivo和(Payment Report)之外,其他单词均相同。

我已经尝试过了:

[\d]+-[\d]+-[\d]+ [\d]+:[\d]+:[\d]+ INFO  ReporteClaro:[\d]+ - Termino de procesar (archivo|Transaction Report)

但这是|运算符的可选匹配。这意味着它将匹配第一行或第二行,但是我严格需要使用正则表达式来匹配它们两者。我以为是这样,但显然不会运行:

[\d]+-[\d]+-[\d]+ [\d]+:[\d]+:[\d]+ INFO  ReporteClaro:[\d]+ - Termino de procesar (archivo&Transaction Report)

PD:我已经尝试使用\ n另一种解决方案,但是有什么方法可以不重复而实现相同的结果呢?:

[\d]+-[\d]+-[\d]+ [\d]+:[\d]+:[\d]+ INFO  ReporteClaro:[\d]+ - Termino de procesar archivo\n

[\d]+-[\d]+-[\d]+ [\d]+:[\d]+:[\d]+ INFO  ReporteClaro:[\d]+ - Termino de procesar Transaction Report

2 个答案:

答案 0 :(得分:1)

如果您仅希望在“ Termino de procesar”之后使用“ archivo”和“ Transaction Report”,即没有“ Termino de procesar Something Else”之类的东西。您可以简单地执行以下操作。

r"^.+Termino de procesar.+$"gm

demo

只有从行首到行尾,只要其中包含“ Termino de procesar”一词,这才有效。

如果还有其他日志条目中包含“ Termino de procesar”,而您不想要的则可以使用以下内容。

r"^.+Termino de procesar archivo.*$|^.+Termino de procesar Transaction Report.*$"gm

demo2

我发现简单通常是最好的解决方案。无需显式选择日期时间内容或“ ReporteClaro”,只需在捕获之前使用全部捕获即可。更容易理解正则表达式imo。

编辑: 除非您逐行阅读它,否则需要gm修饰符。

答案 1 :(得分:1)

这将使他们成为一个整体,并且介于两者之间。

(?s)[\d]+-[\d]+-[\d]+[ ][\d]+:[\d]+:[\d]+[ ]INFO[ ]ReporteClaro:[\d]+[ ]-[ ]Termino[ ]de[ ]procesar[ ](?:archivo|Transaction[ ]Report)(?:.*?[\d]+-[\d]+-[\d]+[ ][\d]+:[\d]+:[\d]+[ ]INFO[ ]ReporteClaro:[\d]+[ ]-[ ]Termino[ ]de[ ]procesar[ ](?:archivo|Transaction[ ]Report))*  

可读版本

 (?s)

 [\d]+ - [\d]+ - [\d]+ [ ] [\d]+ : [\d]+ : [\d]+ [ ] INFO [ ] ReporteClaro: 
 [\d]+ [ ] - [ ] Termino [ ] de [ ] procesar [ ] 
 (?: archivo | Transaction [ ] Report )

 (?:
      .*? [\d]+ - [\d]+ - [\d]+ [ ] [\d]+ : [\d]+ : [\d]+ [ ] INFO [ ] ReporteClaro: 
      [\d]+ [ ] - [ ] Termino [ ] de [ ] procesar [ ] 
      (?: archivo | Transaction [ ] Report )
 )*
相关问题