如何用Python正则表达式提取特定字符串与整数构建字典?
用正则表达式提取结构化字符串为字典的实现思路
这是个很典型的结构化字符串提取需求,用正则表达式完全可以搞定,我来给你拆解几个实用的思路和具体实现:
思路一:分步匹配+键值映射
这种方法先匹配所有键值对,再根据键的类型分别处理值的格式,好处是灵活适配键的顺序变化,后续扩展新键也方便。
实现代码
import re input_str = "item SHIRT 11-14 variance 11-12-13-14-15 color Red" result = {} # 正则匹配每个键值对,捕获键标识和对应的值 pattern = re.compile(r'(item SHIRT|variance|color)\s+(\S+)') matches = pattern.findall(input_str) for key_part, value in matches: # 映射键名并处理值格式 if key_part == 'item SHIRT': result['ShirtType'] = list(map(int, value.split('-'))) elif key_part == 'variance': result[key_part] = list(map(int, value.split('-'))) elif key_part == 'color': result[key_part] = value print(result) # 输出: {'ShirtType': [11, 14], 'variance': [11, 12, 13, 14, 15], 'color': 'Red'}
正则说明
(item SHIRT|variance|color):捕获所有可能的键标识,用|分隔不同选项\s+:匹配键和值之间的任意空白字符(\S+):匹配值(假设值不含空格,用非空白字符匹配)
思路二:命名捕获组一次性匹配
如果输入字符串的格式完全固定(键的顺序、值的格式都不会变),可以用命名捕获组直接匹配所有目标字段,代码更简洁直观。
实现代码
import re input_str = "item SHIRT 11-14 variance 11-12-13-14-15 color Red" # 用命名捕获组精准匹配每个字段 pattern = re.compile( r'item SHIRT (?P<ShirtType>\d+-\d+) ' r'variance (?P<variance>\d+(?:-\d+)+) ' r'color (?P<color>\w+)' ) match_result = pattern.fullmatch(input_str) if match_result: result = { 'ShirtType': list(map(int, match_result.group('ShirtType').split('-'))), 'variance': list(map(int, match_result.group('variance').split('-'))), 'color': match_result.group('color') } print(result)
正则说明
(?P<ShirtType>\d+-\d+):命名捕获组,匹配ShirtType对应的两个数字连字符格式(?P<variance>\d+(?:-\d+)+):匹配variance的多数字连字符格式,(?:...)是非捕获组,只用来重复“-数字”的模式,避免额外生成无用分组(?P<color>\w+):匹配color对应的单个单词值
注意事项
- 如果你的值可能包含空格(比如
color Light Blue),需要调整正则的値匹配部分,比如用正向预查匹配到下一个键之前的内容:(.*?)(?=\s+(?:variance|color|$)) - 数字转整数的步骤要确保值都是纯数字,否则会报错,可以加异常处理或者在正则里更严格匹配数字(比如用
\d+确保是数字)
内容的提问来源于stack exchange,提问作者topgun
相关产品推荐
相关产品推荐

