首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python分析字符串并提取key=value对

Python分析字符串并提取key=value对
EN

Stack Overflow用户
提问于 2020-08-23 07:29:59
回答 2查看 1.8K关注 0票数 0

我有一些文本,我想从中提取Key=Value对(见下文)。我尝试使用regex,但是key=value对的格式不一致。例如,许多值都用引号括起来,有些则没有。

这是几乎起作用的正则表达式,但有几个离群点。

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

消息满足警报条件日期=2020-08-20 time=00:33:57 devname=FGT3HD3999906624 devid=FGT3HD3999906624 logid=“0100032003 type=”事件“subtype=”系统“level=”信息“vd=”根“eventtime=1597847637407862934 tz="+1000”logdesc="Admin注销成功的“sn="159999794”user=“管理”ui="https(10.198.199.105)“method="https”srcip=10.198.199.105 dstip=192.168.23.254 action=“注销”成功“en20#”超时值“”管理员管理超时“(10.198.199.105)”管理员IT管理员Ph:

EN

Stack Overflow用户

回答已采纳

发布于 2020-08-23 09:05:32

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

代码语言:javascript
复制
import re

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

那么你需要创建你的字典。

选项1:最简单的

使用以下regex查找:

代码语言:javascript
复制
result = dict(re.findall(r'(\w*)=(\".*?\"|\S*)', dataPoints))

Regex演示

选项2:典型的拆分

按照解决此问题的典型方法:将各种键值组合拆分为一个列表,然后将每个组合拆分为单独的键和值。但是,由于您的键值对是用空格分隔的,而不是分号、符号或类似的东西,而且您的一些值中也有空格,所以我们不能简单地按空格拆分。这意味着我们需要使用正则表达式向前看,这样才能正常工作:

代码语言:javascript
复制
regexSplit = dict([i.split("=") for i in re.split(r"\s(?=\w+=)", dataPoints)])

选项3:无正则表达式

如果您想完全避免出于任何原因使用regex,可以使用以下方法,在等于符号上拆分,然后将键和值重新组合成创建字典的适当安排:

代码语言:javascript
复制
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项。

所有三个选项的演示

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63544447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档