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

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']

错误原因

  1. \d仅匹配单个数字,无法识别多位数(比如1964会被拆成单个1和9),导致匹配逻辑完全混乱
  2. 非贪婪匹配+?配合单个数字结尾,会把多位数拆分开,同时漏掉无后续数字的最后一段内容

正确解决方案

核心正则表达式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:08:08