如何从冒号分隔的键值字符串生成适配空格、引号场景的Python字典
解决方案
问题原因
你遇到的报错核心是shlex.split仅处理了引号包裹的空格,无法识别未被引号包裹的值的边界:值的结束边界是下一个键的起始标识[键名]:,拆分后的列表会出现大量不带冒号的值片段,直接按token拆分冒号会出现长度为1的元素,不符合字典构造要求。
实现代码
直接用正则匹配所有符合规则的键值对即可,兼容你提到的所有场景:
import re def tokenize(msg): # 正则规则:匹配键+冒号,后跟两种格式的值 pattern = r'([^:\s]+):\s*(?:"([^"]*)"|(.*?))(?=\s+[^:\s]+:|$)' result = {} for match in re.finditer(pattern, msg): key = match.group(1) # 优先取引号包裹的值,否则取非引号格式的值并去掉两端空白 value = match.group(2) if match.group(2) is not None else match.group(3).strip() result[key] = value return result
效果验证
使用你的测试用例运行:
>>> msg = 'key1: "this is value1 " key2:this is value2 key3: this is value3' >>> tokenize(msg) {'key1': 'this is value1 ', 'key2': 'this is value2', 'key3': 'this is value3'}
兼容场景说明
- 自动忽略键和值之间的任意数量空白字符
- 支持双引号包裹的带空格的值,保留引号内的所有内容(包括两端空白)
- 支持未被引号包裹的带空格的值,自动截取到下一个键之前的所有内容
- 支持值本身不带空格的基础格式
内容的提问来源于stack exchange,提问作者pythonRcpp
相关产品推荐
相关产品推荐

