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

2024-06-01 01:16:57 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题以前可能有人问过,但这些与我的情况不符。我已经试过了其中的大部分,但没有一个解决方案是有帮助的。在

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

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行或更多行。如果后面没有行,我只想提取调用行。如果在下一行中成功完成了,那么我还想提取单个主叫行。如果在调用行和成功完成之间还有其他行,我想提取所有这些行。在

下面是我尝试过的与正则表达式一起使用的代码(似乎不起作用)

^{pr2}$

以下是预期输出:

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

Tags: nodeoctsunbbbbatpdtxxxxxxxxcalling
1条回答
网友
1楼 · 发布于 2024-06-01 01:16:57

如果您想要一个regex这应该可以:

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

导致:

^{pr2}$

分解正则表达式

所以你可以玩它:

  1. (?<=\n)calling-如果单词“calling”紧跟在换行符之后,请查找它。在
  2. .*继续不贪婪地匹配任何内容
  3. 直到您按(?=...|...|...)中的一个(|表示或):

    a.\n[^\n]*completed succ[^\n]*\n包含“已完成的成功”的行。这本质上是一个换行符,在“completed success”之前,可以使用任意多个非换行符,更多的字符,最后是一个新行。可能在completed succ部分结束,因为我不关心匹配这行的其余部分,现在我考虑一下。在

    b.\n\+\+以“++”开头的换行符。在

    c.\s*\Z任何数量的空格字符(\n,“,\t等),直到整个字符串\Z结束。

我会考虑使用一个循环,比如:

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

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

相关问题 更多 >