如何组合多个独立正则表达式 提取字符串中的名称、数值与单位
正则提取实现方案
问题说明
待处理源字符串:
[1] weight | width | depth | 5.0 cm | 6.0 mm^2 | 10.12 cm^3
需求为按位置对应关系,提取3组字段的名称、数值、单位信息,预期输出格式:
name = weight value = 5.0 unit = cm name = width value = 6.0 unit = cm^2 name = depth value = 10.12 unit = cm^3
注:原串中width对应位置的单位标记为mm^2,如果预期输出为cm^2,提取后额外加一层单位换算逻辑即可,不影响匹配流程。
方案说明
你之前把三个独立正则直接拼接、用分支运算符组合的方式失效,核心原因是三个正则没有绑定位置关联规则:所有字段名都排在「数值+单位」组合块的前面,分支匹配只会按顺序扫描命中内容,没法自动建立前后片段的一一对应关系。
推荐用两步处理的方案,逻辑清晰、适配性强,不需要硬凑冗长的单条正则:
- 先做结构拆分:切掉开头的序号前缀,按
|分割所有片段,前半段是字段名列表,后半段是等长的「数值+单位」组合列表 - 再做字段提取:对每个「数值+单位」片段提取数值和单位,和同索引的字段名配对即可
具体实现代码
import re raw_str = "[1] weight | width | depth | 5.0 cm | 6.0 mm^2 | 10.12 cm^3" # 1. 拆分结构 clean_str = re.sub(r"^\[\d+\]\s*", "", raw_str) parts = [p.strip() for p in clean_str.split("|")] mid = len(parts) // 2 name_list = parts[:mid] vu_list = parts[mid:] # 2. 匹配数值和单位的正则,基于你原有匹配逻辑调整 vu_re = re.compile(r"(?<![\^])(?<value>[+-]?[0-9]+(?:\.[0-9]+)?)\s+(?<unit>[^0-9\s]\S*)") # 3. 配对输出 for idx, name in enumerate(name_list): vu_match = vu_re.search(vu_list[idx]) print(f"name = {name}") print(f"value = {vu_match.group('value')}") print(f"unit = {vu_match.group('unit')}\n")
固定场景单条正则方案
如果你的输入永远固定是3个字段的结构,也可以用单条正则一次性匹配所有分组,缺点是字段数量变化时需要手动调整正则,维护成本高:
^\[\d+\]\s*(?<n1>\w+)\s*\|\s*(?<n2>\w+)\s*\|\s*(?<n3>\w+)\s*\|\s*(?<v1>[+-]?\d+(?:\.\d+)?)\s+(?<u1>\S+)\s*\|\s*(?<v2>[+-]?\d+(?:\.\d+)?)\s+(?<u2>\S+)\s*\|\s*(?<v3>[+-]?\d+(?:\.\d+)?)\s+(?<u3>\S+)$
匹配后按顺序取n1/v1/u1、n2/v2/u2、n3/v3/u3即可得到对应结果。
内容的提问来源于stack exchange,提问作者Aneesh Narayanan
相关产品推荐
相关产品推荐

