正则表达式匹配模式和打印匹配线以及下一行

时间:2018-01-26 16:15:13

标签: python regex

我试图匹配一个巨大的文件中的模式(日期)行,如果模式匹配,我需要获得下一行。所以,我能够让我们重新模块并使用findall,但我仍然无法在匹配后找到如何打印下一行。

示例文件内容:

<gi2i.1.Conversion.Process.Connection4: Warning: Mon 22/01/2018 - 16:44:11>
Invalid parameter. Remove unused parameter number 4
<END>

<gi2i.1.Conversion.Process.Connection5: Error: Mon 22/01/2018 - 16:44:11>
Invalid parameter. Remove unused parameter number 5
<END>

<gi2i.1.Conversion.Process.Connection6: Warning: Mon 22/01/2018 - 16:44:11>
Invalid parameter. Remove unused parameter number 6
<END>

<gi2i.1.Conversion.Process.Connection7: Warning: Mon 22/01/2018 - 16:44:11>
Invalid parameter. Remove unused parameter number 7
<END>

<gi2i.1.Conversion.Process.Connection8: Warning: Mon 22/01/2018 - 16:44:11>
Invalid parameter. Remove unused parameter number 8
<END>

模式寻找是:22/01/2018

预期产出:

Warning: Mon 22/01/2018 - 16:44:11> Invalid parameter. Remove unused parameter number 4
Error: Mon 22/01/2018 - 16:44:11> Invalid parameter. Remove unused parameter number 5
Warning: Mon 22/01/2018 - 16:44:11> Invalid parameter. Remove unused parameter number 6
Warning: Mon 22/01/2018 - 16:44:11> Invalid parameter. Remove unused parameter number 7
Warning: Mon 22/01/2018 - 16:44:11> Invalid parameter. Remove unused parameter number 8
到目前为止,我试过这个:

print(re.findall("24/01/2018", open('C:\\sample.log_00.txt').read()))

我尝试使用findall和regex的原因是:1。文件很大(所以不要读取每一行然后查找模式。这将需要更多的处理时间) 2. oneline代码和正则表达式使它看起来更容易

1 个答案:

答案 0 :(得分:0)

说你的文字是变量log: 这个 -

matches = [match[0] + ' ' + match[1] for match in re.findall("[^\n]+?: ([^\n]+22/01/2018[^\n]+)\n([^\n]+)", log)]

会在matches中输入格式符合预期输出的匹配列表。

对于来这里搜索如何匹配下一行的任何人,这里有一个解释,以帮助您将此应用于您的具体情况:

所以这就是上面使用的正则表达式的想法:

"<regex for what you're looking for>[^\n]+\n[^\n]+"

用你的正则表达式替换"<regex for what you're looking for>",然后,第一个[^\n]+匹配到行尾,然后\n匹配换行符,然后[^\n]+匹配到下一行结束。

另外,我只包含了我想要在括号中得到的正则表达式的部分。您可以注意到,在这种情况下,第一行的开头和匹配行与下一行之间的换行符不在括号内。

findall函数返回匹配列表。如果正则表达式包含多个&#34;选择&#34;一对括号,每个匹配将作为元组返回,其中元组中的每个项目都是在括号中选择的一部分。如果正则表达式只有一个部分,则匹配将仅作为字符串返回。

我把它全部包裹在list comprehension中,对于每个匹配,变量match在这种情况下将是一个元组。对于每个匹配,列表推导在列表中放置一个字符串,我使用matchmatch[0]match[1])的项目格式化,这是正则表达式的选定部分。