我正在準備一個 python 腳本,它只是根據用戶輸入的電話號碼從 .txt 日志檔案中獲取通話記錄。
我需要幫助撰寫一個捕獲每個呼叫日志的正則運算式,以便它可以“拆分”成一個串列。每個日志都以字母開頭,例如 (L,N,S,E)。在每條日志的請求處,這是一個以“T”開頭的時間戳。例子:T 02/25 00:00
以 (N,S,E) 開頭的記錄有第二行需要包含在內。或者,(L)記錄沒有,但它們確實有一個可以包含在下面的空白區域。
本質上,我需要的是每條以 (L,N,S,E) 開頭的記錄及其下面的行。
請參閱下面的通話記錄示例
T 02/25 00:00 L 065 00 24329 12313 244.0.15.55 252.9.11.90 02/25 08:05 00:00:44 0000 0000 N 066 00 23442 T000185 262.1.00.09 02/25 08:05 00:00:02 A 16630 & 0000 0000 S 067 00 00984 T000134 02/25 08:06 00:00:02 A 61445 & 0000 0000 S 068 00 T000002 29536 02/25 08:05 00:00:36 & 0000 0000 1234567890XXXXXX E 069 00 T000002 T000185 02/25 08:06 00:00:00 & 0000 0000 1234567890XXXXXX
例如:
L 065 00 24329 12313 244.0.15.55 252.9.11.90 02/25 08:05 00:00:44 0000 0000
將是一場比賽,并且
N 066 00 23442 T000185 262.1.00.09 02/25 08:05 00:00:02 A 16630 & 0000 0000
將是另一個,
S 068 00 T000002 29536 02/25 08:05 00:00:36 & 0000 0000 1234567890XXXXXX
將是另一個,依此類推...
我的正則運算式知識有限,但這是我迄今為止想出的。
N(.*)\n(.*)
This selects the first and second line of each record that starts with "N", but it puts them in separate groups. Any direction is appreciated.
uj5u.com熱心網友回復:
要匹配這 4 個字符中的任何一個,您可以使用一個字符類[LNSE],后跟一個空格和該行的其余部分。
然后在同一個捕獲組中使用可選部分來匹配換行符和該行的其余部分(如果它不以任何這些字符開頭)。
這也允許只匹配一行。
^[LNSE] (.*(?:\n(?![LNSE] ).*)?)
^字串的開始[LNSE]匹配任何列出的字符和空格(捕獲組 1.*匹配該行的其余部分(?:非捕獲組\n(?![LNSE] ).*如果換行符不以任何列出的字符開頭,則使用負前瞻匹配換行符和行的其余部分
)?關閉非捕獲組并使其可選
)關閉非捕獲組
請參閱正則運算式演示和Python 演示。
如果要匹配以下 0 行或更多行,可以將更改為0 次或多次重復。
?*如果要匹配包括前導字符在內的整行,則可以省略捕獲組并僅獲取match。
例如,在讀取整個檔案時使用 re.findall 獲取捕獲組 1 的值:
import re
with open('file.log', 'r') as file:
regex = r"^[LNSE] (.*(?:\n(?![LNSE] ).*)*)"
print(re.findall(regex, file.read(), re.MULTILINE))
uj5u.com熱心網友回復:
這是不使用正則運算式的另一種方法:
data = []
with open('file.log', 'r') as f:
next(f)
for line in f:
if line[0] in ("L", "N", "S", "E"):
data.append(line)
else:
data[-1] = line
print(data)
next(f)用于跳過第一行 (T 02/25 00:00)。
假設所有日志都是兩行長,也可以使用串列推導:
with open('file.log', 'r') as f:
next(f)
lines = f.readlines()
data = [''.join(lines[i:i 2]) for i in range(0, len(lines), 2)]
print(data)
每一行都存盤在一個串列中lines(第一行除外,它已被跳過)。然后,串列推導將串列中的元素兩兩連接起來。
如果日志檔案存盤在變數中,則相同:
lines = text.split("\n")[1:] # [-1:] to skip the first line
data = [''.join(lines[i:i 2]) for i in range(0, len(lines), 2)]
print(data)
輸出:
[
'L 065 00 24329 12313 244.0.15.55 252.9.11.90 02/25 08:05 00:00:44 0000 0000\n \n',
'N 066 00 23442 T000185 262.1.00.09 02/25 08:05 00:00:02 A 16630\n& 0000 0000 \n',
'S 067 00 00984 T000134 02/25 08:06 00:00:02 A 61445\n& 0000 0000 \n',
'S 068 00 T000002 29536 02/25 08:05 00:00:36 \n& 0000 0000 1234567890XXXXXX \n',
'E 069 00 T000002 T000185 02/25 08:06 00:00:00 \n& 0000 0000 1234567890XXXXXX'
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441205.html
標籤:python python-3.x regex txt
上一篇:多鍵索引
