Python正则表达式解析字符串并提取键=值对

2024-09-28 05:27:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一些文本中提取Key=Value对(见下文)。我尝试使用正则表达式,但是key=value对的格式不一致。例如,许多值都包含在引号中,有些值则不包含在引号中

这是一个几乎有效的正则表达式,但是有几个异常值

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

消息符合警报条件 date=2020-08-20 time=00:33:57 devname=fgt3hd399990624 devid=fgt3hd399990624 logid=“0100032003”type=“event”subtype=“system”level=“information”vd=“root”eventtime=1597847637407862934 tz=“+1000”logdesc=“Admin注销成功”sn=“15999994”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=“管理员管理员在https上超时(10.198.199.105)” 管理员IT管理员Ph:


Tags: keyhttps文本消息adminvalue管理员格式
2条回答

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

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))

Regex demo

选项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]))

上面的代码假设您的词典将至少包含两个条目

Demo for all 3 options

在正则表达式中添加OR(|)怎么样

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

与您提供的字符串匹配。

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

相关问题 更多 >

    热门问题