[英]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
行之前測試可變數量的行。
(.*\\n)
測試以換行符\\n
結尾的字符串。 {5}
對此進行了5次量化。 ()
周圍的內容可確保所有行都位於一個捕獲組中。 [\\d.+\\]\\[1\\]\\[INFO\\]\\> TTU Back Panel Log Out
是文本必須[\\d.+\\]\\[1\\]\\[INFO\\]\\> TTU Back Panel Log Out
結尾的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.