为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信