python - 正则表达式用键/值对解析分隔字符串(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"', ';']
当然,很容易迭代三个并选择键/值对并忽略捕获的分隔符,但我想知道是否有不同的正则表达式不会捕获分隔符。有什么建议么?
解决方案
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'}
当然,这假设您没有使用;
数据中的任何位置。
推荐阅读
- aframe - 功能上的 A 帧动画对象
- flutter - 如何在颤动的不同包中的另一个函数中使用来自未来函数的变量
- firefox - Firefox 扩展的 Websocket 连接失败
- organization - 如何从组织中删除用户?
- mocha.js - 如何编写测试用例以检查电子邮件字符串在 JavaScript 中的 Mocha / Chai 中是否有效?
- java - 如何使用 Apache Jmeter 性能测试模拟生产 Spring Boot REST API 的流量(TPS 9.05)?
- ibm-cloud - IBM Watson Clinical Annotator API Python SDK - 添加可选参数会引发 400
- mysql - 搜索特定范围的表 mySQL
- elasticsearch - Elasticsearch:有什么方法可以使用 Nest 返回带有内部 ID 的 ISearchResponse.Documents?
- reactjs - React - 删除存储在状态中的数组元素会删除错误的元素