在关键字之间提取字符串并将其分配给变量

时间:2016-08-18 18:09:04

标签: python-3.x

我试图从日志文件中提取特定关键字之间的字符串/行,然后将其分配给变量或计数器。例如:我有一个日志文件,如:

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的映射,但我不确定它将如何与这个循环相关联。任何建议都会有所帮助。谢谢!

1 个答案:

答案 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'。但是,它将仅返回数字,因为外部捕获组已被删除。

Regular expression visualization

Debuggex Demo