繁体   English   中英

Python Regex - 解析字符串并提取键=值对

[英]Python Regex - Parse string and extract key=value pairs

我有一些文本,我想从中提取 Key=Value 对(见下文)。 我尝试使用正则表达式,但是 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.621052.199.1052.1052 action="logout" status="success" duration=4843 reason="timeout" msg="Administrator admin timed out on https(10.198.199.105)" 管理员 IT 管理员 Ph:

您有几种方法可以做到这一点。 首先,由于您说您的键值对嵌入在较大的电子邮件中,因此您需要提取它们。 你可以用这个正则表达式来做到这一点,它检查以单词和等号开头的行:

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 个选项的演示

将 OR ( | ) 添加到您的正则表达式怎么样,例如

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

匹配您提供的字符串。
笔记

  • \\"[\\w\\s\\+()\\.]*\\"匹配所有包含在""的值
  • [\\w\\-\\:\\.]*匹配那些没有

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM