簡體   English   中英

提取變量編號之間的特定行。 來自python中文本文件的行

[英]Extract specific lines between variable no of. lines from text file in 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

現在,我要從調用部分(包括)中提取行到已成功完成的行之上的行。 我也想僅在以++開頭的情況下提取該行。 沒有。 調用后的行數有所不同。 它后面可能有一個空白,兩行或更多行。 如果后面沒有一行,我只想提取調用行。 如果下一行成功完成,那么我也想提取單個調用行。 如果在調用行和成功完成之間還有其他行,我想提取所有這些行。

這也是我嘗試過的代碼以及正則表達式(似乎不起作用)

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

如果您想使用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 -如果單詞“ calling”緊跟換行符,則查找該單詞。
  2. .*繼續非貪婪地匹配任何內容
  3. 直到您擊中(?=...|...|...) |表示或)之一(?=...|...|...) ):

    一種。 \\n[^\\n]*completed succ[^\\n]*\\n包含“完成的succ”的行。 從本質上講,這是一個換行符,您需要的非換行符要多得多,直到“ complete succ”,更多的字符,最后是一個換行符。 可能會以completed succ部分結束,因為我考慮過之后,由於我不在乎匹配此行的其余部分。

    \\n\\+\\+以“ ++”開頭的換行符。

    C。 \\s*\\Z直到整個字符串\\Z結束為止的任意數量的空格字符(\\ n,“”,\\ t等)。

我會考慮僅使用循環,例如:

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 ,以防萬一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM