簡體   English   中英

如何在python中的正則表達式匹配項上方捕獲n行?

[英]How to capture n lines above a regex match in python?

我有一個像這樣的字符串:

[01112017 110228 359][1][INFO]> Get Cash Unit Info
[01112017 110228 400][1][INFO]> ---Cash Unit Info Ready True
[01112017 110228 698][1][INFO]> Cash Unit Info - 0 Value 01  REJC  ---  0000  0000  0004  000    OK
[01112017 110228 699][1][INFO]> Cash Unit Info - 1 Value 02  RETR  ---  0000  0000  0000  000    OK
[01112017 110228 700][1][INFO]> Cash Unit Info - 2 Value 03  BILL  LKR  5000  1000  0999  001    OK
[01112017 110228 700][1][INFO]> Cash Unit Info - 3 Value 04  BILL  LKR  1000  2000  1999  001    OK
[01112017 110228 701][1][INFO]> Cash Unit Info - 4 Value 05  BILL  LKR  0500  2000  1999  001    OK
[01112017 110228 702][1][INFO]> Cash Unit Info - 5 Value 06  BILL  LKR  0100  2000  1999  001    OK
[01112017 110244 760][1][INFO]> ======================================
[01112017 110244 760][1][INFO]> TTU Back Panel Log Out

我想捕獲字符串“ TTU后面板注銷”上方的5行。

我已經嘗試過正則表達式((。* \\ n){5})TTU后面板注銷 ,它輸出0個匹配項

任何幫助,將不勝感激。 注意:在Python3中使用庫re

在您的正則表達式中,您假設目標行以您的模式開頭,而事實並非如此。

雖然,我相信您可以通過遍歷行並使用in查找模式來實現更好,更具可讀性的解決方案。

def find_lines_before_pattern(pattern, n, text):
    lines = text.splitlines()

    for lineno, line in enumerate(lines):
        if pattern in line:
            first_line = max(lineno - n, 0)
            break
    else:
        # Define your behaviour if the pattern is not found
        raise ValueError('Pattern not found')

    return lines[first_line: lineno]

text = """
some
lines
before
your
pattern
[01112017 110244 760][1][INFO]> TTU Back Panel Log Out
"""

find_lines_before_pattern('TTU Back Panel Log Out', 5, text)
# output: ['some', 'lines', 'before', 'your', 'pattern']

嘗試以下操作(假設您的字符串稱為s ):

re.findall('(.*)(?:.*\n){5}.*TTU Back Panel Log Out', s)

返回:

['[01112017 110228 700][1][INFO]> Cash Unit Info - 2 Value 03  BILL  LKR  5000  1000  0999  001    OK']

(?:.*\\n){5}是一個非捕獲組(由於?: :),但是搜索換行之前出現的所有字符5次。 它前面的(.*)是您要捕獲的組

第六行不是以目標字符串TTU Back Panel開頭-還有其他文本。 所以你需要.*? 在此之前:

>>> text = '''[01112017 110228 359][1][INFO]> Get Cash Unit Info
[01112017 110228 400][1][INFO]> ---Cash Unit Info Ready True''' # etc.
>>> re.search('([^\n]*\n){5}.*?TTU Back Panel', text)
<_sre.SRE_Match object; span=(312, 829), match='[01112017 110228 700][1][INFO]> Cash Unit Info - > 

您可以嘗試以下模式:

import re
pattern = r'((.*\n){5})\[\d.+\]\[1\]\[INFO\]\> TTU Back Panel Log Out'

print(re.findall(pattern,text))

輸出:

[('[01112017 110228 700][1][INFO]> Cash Unit Info - 2 Value 03  BILL  LKR  5000  1000  0999  001    OK\n[01112017 110228 700][1][INFO]> Cash Unit Info - 3 Value 04  BILL  LKR  1000  2000  1999  001    OK\n[01112017 110228 701][1][INFO]> Cash Unit Info - 4 Value 05  BILL  LKR  0500  2000  1999  001    OK\n[01112017 110228 702][1][INFO]> Cash Unit Info - 5 Value 06  BILL  LKR  0100  2000  1999  001    OK\n[01112017 110244 760][1][INFO]> ======================================\n', '[01112017 110244 760][1][INFO]> ======================================\n')]

正則表達式信息:

以下RegEx在[\\d.+\\]\\[1\\]\\[INFO\\]\\> TTU Back Panel Log Out行之前測試可變數量的行。

  1. (.*\\n)測試以換行符\\n結尾的字符串。
  2. {5}對此進行了5次量化。
  3. ()周圍的內容可確保所有行都位於一個捕獲組中。
  4. [\\d.+\\]\\[1\\]\\[INFO\\]\\> TTU Back Panel Log Out是文本必須[\\d.+\\]\\[1\\]\\[INFO\\]\\> TTU Back Panel Log Out結尾的字符串。

暫無
暫無

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

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