亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python Regex - 解析字符串并提取鍵=值對

Python Regex - 解析字符串并提取鍵=值對

躍然一笑 2023-06-13 14:48:06
我有一些文本想從中提取 Key=Value 對(見下文)。我嘗試使用正則表達式,但是鍵=值對的格式不一致。例如,許多值都用引號引起來,有些則沒有。這是幾乎有效的正則表達式,但有幾個異常值。(\w*)=([\w,\",:,\-,(,\.,\+,\)]*)消息滿足警報條件 date=2020-08-20 time=00:33:57 devname=FGT3HD3999906624 devid=FGT3HD3999906624 logid="0100032003" type="event" subtype="system" level="information" vd="root" eventtime =1597847637407862934 tz="+1000" logdesc="管理員注銷成功" sn="159999794" user="admin" ui="https(10.198.199.105)" method="https" srcip=10.198.199.105 dstip=192.168.23.254 action="logout" status="success" duration=4843 reason="timeout" msg="Administrator admin 在 https(10.198.199.105) 上超時" Administrator IT Administrator Ph:
查看完整描述

2 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

你有幾種方法可以做到這一點。首先,由于您說過您的鍵值對嵌入在較大的電子郵件中,因此您需要提取它們。您可以使用此正則表達式執行此操作,它檢查以單詞和等號開頭的行:


import re


text = " ... Full email text ... "

dataPoints = re.search(r"^\w*=.*$", text, re.MULTILINE).group(0)

然后你需要創建你的字典。


選項 1:最簡單


使用以下正則表達式查找:


result = dict(re.findall(r'(\w*)=(\".*?\"|\S*)', dataPoints))

正則表達式演示

選項 2:典型拆分


遵循此問題的典型方法:將各種鍵值組合拆分為一個列表,然后將每個組合拆分為單獨的鍵和值。但是,由于您的鍵值對是用空格分隔的,而不是分號、& 符號或類似的東西,并且您的某些值中有空格,所以我們不能簡單地按空格分隔。這意味著我們需要使用正則表達式前瞻才能正常工作:


regexSplit = dict([i.split("=") for i in re.split(r"\s(?=\w+=)", dataPoints)])

選項 3:沒有正則表達式


如果你出于任何原因想完全避免使用正則表達式,你可以使用以下內容,它按等號拆分,然后將鍵和值重新組合成正確的排列以創建字典:


allSplits = dataPoints.split("=")

splitList = [allSplits[0]] + [i for a in allSplits[1:-1] 

    for i in a.rsplit(" ", 1)] + [allSplits[-1]]


splitDict = dict(zip(splitList[::2], splitList[1::2]))

上面的代碼假定您的字典最終將至少包含 2 個項目。

所有 3 個選項的演示


查看完整回答
反對 回復 2023-06-13
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

將 OR ( |) 添加到您的正則表達式怎么樣,例如

(\w*)=(\"[\w\s\+()\.]*\"|[\w\-\:\.]*)

匹配你給的字符串。
筆記

  • \"[\w\s\+()\.]*\"匹配包含在""

  • [\w\-\:\.]*匹配那些沒有


查看完整回答
反對 回復 2023-06-13
  • 2 回答
  • 0 關注
  • 345 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號