提取变量no之间的特定行。 python中的文本文件中的行

时间:2017-12-21 06:26:29

标签: python regex search extract

这个问题可能以前曾被问过,但那些问题与我的情况不符。我已经完成了大部分工作,但没有一个解决方案有所帮助。

所以,这就是问题所在。我有一个包含大量行的文本文件 以下是该文件的示例:

yyyyyy=xxxx  
yyyyyy=xxxxxxxx

Sun Oct 22 15:19:23 PDT 2017  
calling sequenc node

++ entering node aaa (       )  
Sun Oct 22 15:19:23 PDT 2017  
lines xxxxxxxx  
calling wroot.bat  

++ entering node bbb (xxx       )  
Sun Oct 22 15:19:23 PDT 2017  
xxxxxxxxxxxxxx  
calling bsod.bat   
xaaaaa
bbbbb
tttttt
bbb completed successfully  
-- exiting node bbb  

++ entering node ccc (yyyy      )  
Sun Oct 22 15:19:35 PDT 2017  
xxxxxxxxxxxxxxxxx  
calling wpretest.bat

现在,我想从调用部分(包括)中提取行到已完成的成功行之上的行。另外,我想在只有++开头的时候提取行。没有。呼叫后的线路各不相同它可能有一个空白,2行或更多行。如果它后面没有行,我只想提取调用行。如果在下一行成功完成,那么我也想提取单个调用行。如果在调用行之间有其他行并且已成功完成,我想提取所有这些行。

这是我和正则表达式一起尝试的代码(似乎没有用)

with open('myfile.txt','r') as log: 
    for line in log:

        match = re.search(node_name_pattern, line)
        if line.startswith('++') and match:           
            node_name.append(match.group())
            nn=match.group()
        match2 = re.search(node_parameter, line)
        if line.startswith('++') and match2:
            parameter.append(match2.group())
            start_time.append(log.next().strip())
            features.append(log.next().strip())
        if "calling" in line :
                content.append(line.strip())

这是预期的输出:

calling wroot.bat
calling bsod.bat,
xaaaaa,
bbbbb,
tttttt 
calling wpretest.bat

1 个答案:

答案 0 :(得分:1)

如果你想要regex这应该有效:

r'(?<=\n)calling.*?(?=\n[^\n]*completed succ[^\n]*\n|\n\+\+|\s*\Z)'

导致:

>>> bla = open('bla').read()
>>> re.findall(r'(?<=\n)calling.*?(?=\n[^\n]*completed succ[^\n]*\n|\n\+\+|\s*\Z)',bla,re.DOTALL)
['calling sequenc node\n', 'calling wroot.bat  \n', 'calling bsod.bat   \nxaaaaa\nbbbbb\ntttttt', 'calling wpretest.bat']

打破正则表达式

所以你可以玩它:

  1. (?<=\n)calling - 寻找单词&#34; call&#34;如果它紧跟在换行符之后。
  2. .*继续非贪婪地匹配任何内容
  3. 直到您点击(?=...|...|...)之一(|表示或):

    一个。 \n[^\n]*completed succ[^\n]*\n包含&#34;完成succ&#34;的行。这本质上是一个换行符,因为你需要许多非换行符,直到&#34;完成succ&#34;,更多字符,最后是新行。可能会在completed succ部分结束,因为我不在乎匹配这一行的其余部分,现在我考虑一下。

    \n\+\+以&#34; ++&#34;。

    开头的换行符

    ℃。 \s*\Z任意数量的空格字符(\ n,&#34;&#34;,\ t等),直到整个字符串\Z结束。

  4. 我会考虑使用循环,例如:

    res = []
    inside = False
    with open('bla') as bla:
        for line in bla:
            if inside:
                if line.startswith('++') or "completed successfully" in line: 
                    inside = False
                else:
                    res[-1].append(line)              
            elif line.startswith("calling"):
                res.append([line])
                inside = True
    

    如果该行以inside==False开头,可能会错误检查calling,以防万一。