首页 > 解决方案 > 正则表达式用键/值对解析分隔字符串(python)

问题描述

我有文本格式的数据,其中键/值对用分号分隔,后面可能跟空格,也可能不是,例如“;” 或“;”,甚至“;”。对之间总是有一个分号,字符串以分号结尾。

键和值由空格分隔。

这根弦是平的。从来没有任何嵌套的东西。字符串总是被引用,而数值从不被引用。我可以指望这在输入中是一致的。例如,

'cheese "stilton";pigeons 17; color "blue"; why "because I said so";'

最终这结束为

{'cheese': "stilton", 'pigeons': 17, 'color': "blue"; 'why': "because I said so"}

不同的字符串可能包含不同的键/值对,我无法提前知道会出现哪些键。所以这是同样有效的输入字符串:

mass 6.02 ; mammal "gerbil";telephone "+1 903 555-1212"; size "A1";

我认为将字符串拆分为列表的正则表达式将是一个好的开始,然后只需两次遍历列表即可构建字典。就像是

x = PATTERN.split(s)
d = {}
for i in range(0, len(x), 2):
    d[x[i]] = d[x[i+1]]

这需要像 ['cheese', 'stilton', 'pigeons', 17, 'color', 'blue', 'why', 'because I said so'] 这样的列表。但我想不出一个正则表达式来获得这种形式。我最近的是

([^;[\s]*]+)

哪个返回

['', 'cheese', ' ', '"stilton"', ';', 'pigeons', ' ', '17', '; ', 'color', ' ', '"blue"', '; ', 'why', ' ', '"because', ' ', 'I', ' ', 'said', ' ', 'so"', ';']

当然,很容易迭代三个并选择键/值对并忽略捕获的分隔符,但我想知道是否有不同的正则表达式不会捕获分隔符。有什么建议么?

标签: pythonregexregex-group

解决方案


findall()它可能比这里更容易使用split()。这将允许您使用捕获组来提取您想要的部分。然后您可以拆分组、清理等:

import re
s = 'cheese "stilton";pigeons 17; color "blue"; why "because I said so";'
pairs = re.findall(r'(\S+?) (.+?);', s)

d = {}
for k, v in pairs:
    if  v.isdigit():
        v = int(v)
    else:
        v = v.strip('"')
    d[k] = v
print(d)

结果

{'cheese': 'stilton',
 'pigeons': 17,
 'color': 'blue',
 'why': 'because I said so'}

当然,这假设您没有使用;数据中的任何位置。


推荐阅读