我试图匹配一个巨大的文件中的模式(日期)行,如果模式匹配,我需要获得下一行。所以,我能够让我们重新模块并使用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代码和正则表达式使它看起来更容易
答案 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
在这种情况下将是一个元组。对于每个匹配,列表推导在列表中放置一个字符串,我使用match
(match[0]
,match[1]
)的项目格式化,这是正则表达式的选定部分。