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

Python如何用正则捕获字符串开头至每次指定模式前的内容

问题原因

你所用的r'.+?(?=UNTIL)'是非贪婪分段匹配逻辑:正则引擎每完成一次匹配,就会将匹配指针移动到当前匹配内容的末尾,下一次匹配从新指针位置开始,因此最终返回的是相邻两个UNTIL之间的分段内容,无法得到从字符串起始位置累计的前缀结果。

实现方案

Python标准库re模块不支持单条findall直接返回累计前缀(正则默认会消耗已匹配字符,不会自动回溯到字符串起始位置做内容累计),但可以通过正则定位+底层切片的方式实现,所有匹配逻辑由正则引擎完成,性能适配大文件处理场景,代码如下:

import re

txt = "Here's some text UNTIL for the 1st time, then some more text UNTIL for the 2nd time, and finally more text UNTIL the 3rd time."
result = [txt[:match.start()] for match in re.finditer(r'UNTIL', txt)]

运行后返回结果和预期完全一致:

[
  "Here's some text ",
  "Here's some text UNTIL for the 1st time, then some more text ",
  "Here's some text UNTIL for the 1st time, then some more text UNTIL for the 2nd time, and finally more text ",
]

性能说明

  • 关键词定位完全由正则引擎的C层实现,遍历GB级大文件的速度远高于Python层手动循环、逐字符查找逻辑
  • 字符串切片是Python底层内存视图操作,无额外全量拷贝开销,不会增加处理时延

如果要求结果完全由正则捕获组返回、不做额外切片操作,可以使用第三方regex库(支持更多正则高级特性),对应写法如下,可直接通过findall返回目标结果:

# 需先安装:pip install regex
import regex

txt = "Here's some text UNTIL for the 1st time, then some more text UNTIL for the 2nd time, and finally more text UNTIL the 3rd time."
result = regex.findall(r'(?s)(?:\G(?!\A).*?UNTIL)*?\K.*?(?=UNTIL)', txt)

内容的提问来源于stack exchange,提问作者user4850501

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:09:33