我試圖從一些非常混亂的日志檔案中提取特定的會話 ID,甚至查看其他示例也很難實作任何看起來有效的正則運算式。日志是這樣讀取的,我試圖收集在第一次找到給定的較早字串后出現的特定 SessionId “TestAPIurl”
b'{\n "log": {\n "version": "1.2",\n "creator": {\n "name": "mitmproxy har_dump",
\n "version": "0.1",\n "GET": "TestAPIurl"\n },
\n "entries": [\n {\n "startedDateTime": "2021-10-11T22:39:30.916773 00:00",
\n "sessionId": "1521-35236erg-fggr4",\n "request": {\n "method": "POST",\n
我正在努力使用所需的正則運算式,以確保我只獲得在正確的 TestAPIurl 之后出現的 sessionId。我設法能夠捕獲 sessionID 值,但是有多個 sessionId,我很難確保在模式“TestAPIurl”之后獲得第一個,因為“TestAPIurl”和下一個“sessionId”之間的空間和值可以變化很大。
m = re.search('(?<=sessionId":\s.).*(?=")', file)
m.group()
uj5u.com熱心網友回復:
首先,它看起來很像 JSON。將其作為 JSON 處理是一種選擇嗎?如果是這樣,我肯定會嘗試進行這項作業,因為我可以完全控制知道哪個會話屬于哪個請求。
但如果不是...
我將您的示例資料剝離下來,然后將其翻倍,使TestAPIurlFoo和TestAPIurlBar:
import re
input = '''
{\n "log": {\n
\n "version": "0.1",\n "GET": "TestAPIurlFoo" },
\n "entries": [\n {\n
\n "sessionId": "sessionIdFoo",\n "request": {\n "method": "POST",\n ...
{\n "log": {\n
\n "version": "0.1",\n "GET": "TestAPIurlBar" },
\n "entries": [\n {\n
\n "sessionId": "sessionIdBar",\n "request": {\n "method": "POST",\n ...
'''
api_url_names = ['TestAPIurlFoo','TestAPIurlBar', 'TestAPIurlBaz']
for api_url_name in api_url_names:
pattern = f'"{api_url_name}". ?"sessionId": "(. ?)"' # build pattern for either Foo or Bar
match = re.search(pattern, input, re.DOTALL) # DOTALL so that `.` matches newlines
if match:
print(match.group(1))
我得到以下資訊:
sessionIdFoo
sessionIdBar
搜索TestAPIurlBaz什么都不回傳,我認為這就是您想要的。re.DOTALL 允許搜索以.(點)字符類^1跨換行符匹配文本。
我想到你的要求,用正則運算式,比如:
我想要的模式以這個API-url 開始,以第一個會話 ID 結束
這是 Foo 的模式:
"TestAPIurlFoo". ?"sessionId": "(. ?)"
. ?意味著,文字"TestAPIurlFoo"和"sessionId".
uj5u.com熱心網友回復:
這是一個將回傳鍵值的正則運算式sessionId。
>>> re.search('"sessionId"\s*:\s*"(. ?)"', file).group(1)
1521-35236erg-fggr4
請注意,您提供的字串以 為前綴b,因此它看起來像 abytes而不是 a str- 您可能還需要在正則運算式模式前加上前綴b,或者傳遞類似的內容file.decode("utf8")而不是僅傳遞file給re.search()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358672.html
下一篇:使用正則運算式選擇文本的特定部分
