You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何组合多个独立正则表达式 提取字符串中的名称、数值与单位

正则提取实现方案

问题说明

待处理源字符串:

[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:06:22