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

Python正则贪婪/非贪婪量词问题:无法正确提取排除末尾冒号的步骤标题

Python正则解析步骤标题:贪婪/非贪婪量词问题解决

先拆解你遇到的两个正则的核心问题:

为什么r1和r2都失效?

r1:r"Step ?([0-9]+) ?(.*) ?:?"

.*是贪婪量词,会尽可能匹配最多字符。因为后面的?:?是可选匹配(允许匹配0次冒号),贪婪模式下.*会直接吞掉包括末尾冒号在内的所有内容直到行尾,根本不会给?:?留匹配机会,导致标题内容包含冒号。

r2:r"Step ?([0-9]+) ?(.*?) ?:?"

.*?是非贪婪量词,会尽可能匹配最少字符。后面的?:?允许匹配0次冒号,所以.*?直接匹配空字符串就满足了“后面可跟0次冒号”的条件,导致标题内容捕获为空。

正确正则写法(满足需求)

要实现「提取编号和标题、排除末尾冒号、允许标题内部有冒号」,可以用正向零宽预查限定标题的结束位置:

pattern = r"Step ?([0-9]+) ?(.*?)(?=:$|$)"

正则拆解:

  • Step ?:匹配"Step",兼容后面带/不带空格的写法(比如Step或Step )
  • ([0-9]+):捕获步骤编号(至少1个数字,兼容1、2等格式)
  • ?:兼容编号和标题之间带/不带空格的情况(比如Step 1、Step2、Step 3Making)
  • (.*?):非贪婪匹配标题内容,直到满足后面的预查条件
  • (?=:$|$):正向零宽预查,确保当前位置后要么是「冒号+行尾」,要么是「直接行尾」——既不会把末尾冒号包含进标题,又允许标题内部存在冒号。

测试示例

import re

text = """Step 1 Introduce The Assets:
Step2 Verifying the Assets
Step 3Making sure all the data is in the right place:
"""

# 加re.MULTILINE让$匹配每行的结尾
matches = re.findall(pattern, text, re.MULTILINE)
for num, title in matches:
    print(f"步骤编号:{num},标题内容:{title.strip()}")

输出结果:

步骤编号:1,标题内容:Introduce The Assets
步骤编号:2,标题内容:Verifying the Assets
步骤编号:3,标题内容:Making sure all the data is in the right place

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:40:27