如何用正则表达式从文件中稳定提取多组标签与对应数值?
嘿,我完全懂你现在的头疼之处——自己写的提取函数不稳定,只能抓1-2个值,标签和数值还经常对不上,想用正则又没太多经验对吧?别担心,咱们一步步来解决这个问题。
先理清楚你的需求:从非结构化的文本里,精准匹配特定标签(比如Bit、From、To这类)对应的数值,数值格式还可能包含整数、小数、带空格的分数(比如示例里的4 3/4)。
先分析你的示例场景
输入文本:Run Bora Hot Record Casing Record No. From To Sue fr To One 4 3/4 4569 TD 5.5 15 .5 Surface 4569
预期提取:Bit: 4 3/4, From: 4569, TD:5.5, Surface:4569...
解决方案:用正则实现稳定的标签-数值匹配
核心思路是先定位目标标签,再精准捕获它后面的数值。这里给你一个可直接复用的Python函数示例,你可以根据实际需求调整标签和数值规则:
import re def extract_tag_values(text): # 定义要提取的标签及对应的正则匹配规则 # 你可以根据实际文本的标签/数值格式,随时添加或修改规则 tag_rules = { 'Bit': r'To One\s+(\d+\s+\d+/\d+)', # 匹配"To One"后的带空格分数(如4 3/4) 'From': r'From\s+(\d+)', # 匹配"From"后的整数 'TD': r'TD\s+(\d+\.\d+)', # 匹配"TD"后的小数 'Surface': r'Surface\s+(\d+)', # 匹配"Surface"后的整数 # 示例:如果需要匹配To的数值,可添加类似规则: # 'To': r'To\s+(\d+\.?\d*)' } extracted_result = {} for tag, pattern in tag_rules.items(): # 查找第一个匹配的内容,如需多匹配可改用re.findall match = re.search(pattern, text) if match: # 去除数值前后可能的多余空格 extracted_result[tag] = match.group(1).strip() return extracted_result # 测试你的示例文本 sample_text = "Run Bora Hot Record Casing Record No. From To Sue fr To One 4 3/4 4569 TD 5.5 15 .5 Surface 4569" result = extract_tag_values(sample_text) # 打印提取结果 for tag, value in result.items(): print(f"{tag}: {value}")
关键调整说明
- 数值格式适配:如果你的数值有更多变体(比如不带空格的分数、负数、多位小数),可以修改正则的捕获组。比如把分数匹配规则改成
(\d+\s*\d+/\d+),就能兼容带/不带空格的分数格式。 - 标签大小写兼容:如果文本里标签有大小写变体(比如"FROM"或"from"),可以在
re.search里加上忽略大小写的标志:re.search(pattern, text, re.IGNORECASE)。 - 多匹配场景:如果同一个标签出现多次需要提取所有数值,把
re.search换成re.findall,并将结果存为列表即可。
这样调整后,你的提取函数就能稳定捕获多个标签对应的数值,不会再出现匹配不稳定的问题啦。
内容的提问来源于stack exchange,提问作者FanScience
相关产品推荐
相关产品推荐

