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

如何匹配从字符串末尾开始的第一个start实例?

匹配字符串末尾的第一个start实例

你当前的正则(start[\s\S]*$)(?=$)之所以会匹配从第一个start到结尾的全部内容,是因为[\s\S]*是贪婪匹配,它会尽可能多地捕获字符,直接从第一个start一直读到字符串末尾,后面的(?=$)完全是多余的,因为*$已经限定了到结尾。

要匹配从末尾往前数的第一个start(也就是最后一个start)及其后面的内容,需要用负向预查来限制:在匹配start之后的内容里,不能再出现另一个start。

修正后的正则与代码

import re
pattern = r'start(?:(?!start)[\s\S])*$'
string = 'start\nfoo\nmoo\nstart\nfoo\ndoo'
result = re.search(pattern, string)
print(result.group())

原理说明

  • start:匹配目标关键词
  • (?:(?!start)[\s\S])*:非捕获组,(?!start)是负向预查,确保当前位置之后没有start,然后[\s\S]匹配任意字符(包括换行),*表示重复这个匹配逻辑,直到字符串结尾
  • $:限定匹配到字符串末尾

这样就能精准捕获最后一个start及其后续的所有内容,输出结果就是你期望的:

start
foo
doo

另外也可以用单行模式简化写法,效果一致:

pattern = r'(?s)start(?!.*start).*'

这里(?s)让.匹配换行符,(?!.*start)确保后面没有其他start,.*匹配到结尾。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:25:52