如何匹配从字符串末尾开始的第一个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
相关产品推荐
相关产品推荐

