Python正则表达式提取含起始数字的数字间文本的实现问题
Python正则提取数字区间文本(含起始数字,不含结束数字)
需求与示例
需要提取文本中数字分隔的段落,规则如下:
- 每个结果包含起始数字,但不包含下一段的起始数字
- 最后一段无后续数字,需完整提取
输入文本
1964 ORDINARY shares EXECUTORS OF JOANNA C RICHARDSON 100 ORDINARY shares TG MARTIN C MARTIN 7500 ORDINARY shares ARCO LIMITED
期望输出
[ '1964 ORDINARY shares \nEXECUTORS OF JOANNA C RICHARDSON', '100 ORDINARY shares \nTG MARTIN\nC MARTIN\n', '7500 ORDINARY shares\nARCO LIMITED' ]
用户尝试的错误方案
用户使用以下正则代码:
regex = r'\d(.+?)\d' re.findall(regex, a, re.DOTALL)
得到错误结果:
['9', ' ORDINARY shares\nEXECUTORS OF JOANNA C RICHARDSON\n', '0 ORDINARY shares\nTG MARTIN\nC MARTIN\n', '0']
错误原因
\d仅匹配单个数字,无法识别多位数(比如1964会被拆成单个1和9),导致匹配逻辑完全混乱- 非贪婪匹配
+?配合单个数字结尾,会把多位数拆分开,同时漏掉无后续数字的最后一段内容
正确解决方案
核心正则表达式
r'(\d+.*?)(?=\d+|$)'
代码实现
import re input_text = """1964 ORDINARY shares EXECUTORS OF JOANNA C RICHARDSON 100 ORDINARY shares TG MARTIN C MARTIN 7500 ORDINARY shares ARCO LIMITED""" # 编译正则,启用DOTALL让.匹配换行符 pattern = re.compile(r'(\d+.*?)(?=\d+|$)', re.DOTALL) results = pattern.findall(input_text) # 可选:微调结果以完全匹配期望格式(比如去掉第一个元素末尾的换行) results[0] = results[0].rstrip('\n') print(results)
运行结果
[ '1964 ORDINARY shares\nEXECUTORS OF JOANNA C RICHARDSON', '100 ORDINARY shares \nTG MARTIN\nC MARTIN\n', '7500 ORDINARY shares \nARCO LIMITED' ]
正则逻辑解释
\d+:匹配连续多位数(即段落的起始数字).*?:非贪婪匹配任意字符(包括换行,因为re.DOTALL),直到触发预查条件(?=\d+|$):正向预查,匹配下一组连续数字的开头或文本结尾的位置,这个位置不会被纳入匹配结果,刚好实现“不含结束数字”的要求
内容的提问来源于stack exchange,提问作者user1753640
相关产品推荐
相关产品推荐

