如何使用正则表达式从段落中提取指定语句及13位编码
正则提取优化方案
核心需求
需通过正则从大段文本中提取三类目标内容:
- 固定语句:
Updating measure to exclude the ean added from catalogue list - 上述固定语句与13位数字编码之间的任意内容
- 13位纯数字编码(示例:
7090056511721)
特殊适配要求:13位数字编码不一定位于匹配片段末尾,编码后方可存在其他文本内容。
测试样例
Query Opened: /* Updating measure to exclude the ean added from catalogue list */ Cartesian scope: ([Box].[Box].Filter( #.Name == "Box 1") * [LocalPricePoint].[LocalPricePoint].Filter( #.Name == "Premium") * [Gender].[Gender].Filter( #.Name == "Male") * [LocalUniverse].[LocalUniverse].Filter( #.Name == "Creator") * [BusinessCategory].[BusinessCategory].Filter( #.Name == "Frames") * [Time].[Trimester].Filter( #.Name == "22.2") * &CWV * [Product].[EAN].Filter(#.Name in {[7090056511721],[7090056511714]}) * Location.[Banner].Filter( #.Name == "SCCH1") * Profile.[Profile].Filter(#.Name in {[Premium]}));Measure.[IntNewBAStatus]=1;End Scope;
原有写法问题
原有待优化模式:
pattern = ('Updating measure to exclude the ean added from catalogue list')('any words in between')(\d{13})?
存在的核心问题:
- 未处理固定语句内部可能出现的换行、多空白字符隔断场景,测试样例中固定语句被拆为两行,直接按整句精确匹配会失败
- 缺失中间任意内容的匹配逻辑,未做非贪婪控制,极易出现匹配过界问题
- 13位数字部分加了
?可选标记,不符合必须提取到对应编码的要求 - 未做数字边界校验,容易从更长的连续数字串中错误截取13位片段
优化后正则实现
模式代码(Python示例)
import re pattern = r'Updating\s+measure\s+to\s+exclude\s+the\s+ean\s+added\s+from\s+catalogue\s+list([\s\S]*?)(?<!\d)(\d{13})(?!\d)' # 单次匹配取首个符合要求的结果 match_result = re.search(pattern, test_text) if match_result: full_segment = match_result.group(0) # 完整匹配片段:固定语句+中间内容+13位编码 middle_content = match_result.group(1) # 固定语句与编码之间的任意内容 ean_code = match_result.group(2) # 提取到的13位编码
适配逻辑说明
- 固定语句的单词间用
\s+匹配,自动兼容空格、换行、制表符等各类空白隔断场景,适配样例中固定语句跨行的情况 - 中间内容用
[\s\S]*?做非贪婪匹配,会定位到离固定语句最近的符合要求的13位数字,不会无限制向后匹配造成过界 - 13位数字前后添加负向零宽断言
(?<!\d)和(?!\d)做边界校验,确保匹配到的是独立的13位数字,不会从更长数字串中错误截段 - 移除了数字部分的可选标记,只有匹配到符合规则的13位数字才会返回结果
- 数字匹配完成即终止当前匹配流程,无需要求编码位于片段末尾,完全兼容编码后方存在其他文本的场景
- 如果需要提取固定语句后所有符合规则的13位编码,可在匹配到固定语句的起始位置后,对后续文本段使用
re.findall(r'(?<!\d)\d{13}(?!\d)', sub_text)即可批量获取。
内容的提问来源于stack exchange,提问作者diegoto
相关产品推荐
相关产品推荐

