我试图从日志文件中提取特定关键字之间的字符串/行,然后将其分配给变量或计数器。例如:我有一个日志文件,如:
import os
import re
def GetTheSubString(logfile):
with open(logfile) as p:
for result in re.findall('DEF(.*?)ABC', p.read(), re.S):
return (result)
substr = GetTheSubString("P3.log")
substr
这里的开始关键字是" DEF"结束关键字是" ABC"。我想提取具有关键字&#34的行;这是"从这些关键字之间。输出应该是:
迭代1 = [123,456] 迭代2 = [123,678]
我的代码到目前为止..
>>
这只返回字符串的第一部分。我有另一段代码已经完成了123和456的映射,但我不确定它将如何与这个循环相关联。任何建议都会有所帮助。谢谢!
答案 0 :(得分:0)
你的正则表达是对的。你唯一做错的是,返回第一个结果本身。虽然re.findall('DEF(.*?)ABC', p.read(), re.S)
找到了所有相关内容,但您会对其进行迭代,而当您第一次点击return
时,您最终只会返回第一个元素。进行以下更改:
>>> import os
>>> import re
>>>
>>> def GetTheSubString(logfile):
... with open(logfile) as p:
... return re.findall('DEF(.*?)ABC', p.read(), re.S)
...
>>> substr = GetTheSubString("P3.log")
>>> print substr
[' this is something in line 3\nthis is a 123 456\n34\ncat dog rainfall \nsome relevant information\n', ' something in this line\nthis is a 123 678\n']
现在,您可以将任何想要的内容应用于抓取的内容。
但是,如果您想在函数本身中执行此操作,我会这样做:
>>> import os
>>> import re
>>>
>>> def GetTheSubString(logfile):
... with open(logfile) as p:
... return re.findall('DEF(?:.*?)this is a (\d+) (\d+)(?:.*?)ABC', p.read(), re.S)
...
>>> substr = GetTheSubString("a")
>>> print substr
[('123', '456'), ('123', '678')]
在这里,正则表达式将匹配' DEF'之间的所有内容。对于这个',这两个号码是$ num1 $ num2'以及从那里到ABC'。但是,它将仅返回数字,因为外部捕获组已被删除。