Python拆分含空格键名的键值对时出现IndexError的解决求助
处理含空格键名的字符串转字典问题
问题场景
给定如下格式的字符串:
'EXP DATE: 13.04.2022 PO: P101' 'LOCATION: 111 CONDITION: FN'
需要转换为对应的字典:
{"EXP DATE": "13.04.2022", "PO": "P101"} {"LOCATION": "111", "CONDITION": "FN"}
原实现的函数在处理不含空格键名的字符串时正常,但遇到带空格的键名(如EXP DATE)时会触发IndexError: list index out of range:
def create_key_pair(lst): return {lst[i].replace(':', ''): lst[i + 1] for i in range(0, len(lst), 2)}
报错原因:原函数依赖按空格拆分后的列表按「键-值」成对排列,但含空格的键会被拆成多个元素,破坏了成对结构,导致遍历到末尾时索引越界。
可行解决方案
正则表达式匹配法(推荐)
利用正则精准匹配「允许含空格的键(以冒号结尾)」和「对应的值(直到下一个键或字符串结束)」,完美适配两种键名格式:
import re def str_to_dict(input_str): # 匹配模式:捕获键(含空格,到冒号为止)和对应的值 match_pattern = r'([\w\s]+?):\s*([^:]+?)(?=\s+\w|$)' key_value_pairs = re.findall(match_pattern, input_str) # 去除键值两端的空白符后构建字典 return {key.strip(): value.strip() for key, value in key_value_pairs} # 测试验证 test_str1 = 'EXP DATE: 13.04.2022 PO: P101' test_str2 = 'LOCATION: 111 CONDITION: FN' print(str_to_dict(test_str1)) # 输出: {'EXP DATE': '13.04.2022', 'PO': 'P101'} print(str_to_dict(test_str2)) # 输出: {'LOCATION': '111', 'CONDITION': 'FN'}
正则模式说明:
([\w\s]+?)::非贪婪匹配字母、数字、空格组成的键,直到遇到冒号\s*:匹配键和值之间的任意空白字符(包括空格、制表符等)([^:]+?):非贪婪匹配除冒号外的所有字符作为值(?=\s+\w|$):正向预查,确保值匹配到下一个键的开头(空格+字母/数字)或字符串结尾时停止
非正则的手动拆分法
如果不想依赖正则,可以通过按冒号分割后逐个重组键值对,但逻辑相对繁琐:
def str_to_dict(input_str): segments = input_str.split(':') result = {} current_key = segments[0].strip() for seg in segments[1:]: # 分割当前段为值和下一个键 parts = seg.rsplit(' ', 1) if len(parts) == 2: value, next_key = parts result[current_key] = value.strip() current_key = next_key.strip() else: # 处理最后一个值 result[current_key] = seg.strip() return result
这个方法通过反向分割每个冒号后的片段,分离出值和下一个键,也能处理带空格的键名,但对复杂格式的兼容性不如正则。
内容的提问来源于stack exchange,提问作者Александр Хипхопов
相关产品推荐
相关产品推荐

