如何用Python正则提取固定起止模式内的目标内容(限非不定宽搜索)
嘿,我完全懂你的需求——就是要精准揪出从aa开头到第一个bb结束的片段里的所有target,绝对不能把后面bb之后的target3也算进来,而且之前用的正则因为涉及可变宽度的后行断言,在Python标准库的re里根本跑不通对吧?
给你几个靠谱的解决方案,按推荐程度排序:
方案一:分两步匹配(最稳妥,推荐)
先把aa到第一个bb之间的内容单独抠出来,再在这个小片段里找所有target。这种方法逻辑清晰,完全避开了正则断言的限制,还能适配片段里任意数量的target:
import re text = "aa.....target1...target2.....bb...target3...bb" # 第一步:提取aa到第一个bb之间的内容(非贪婪匹配避免吃到后面的bb) section_match = re.search(r'aa(.*?)bb', text) if section_match: inner_content = section_match.group(1) # 第二步:在这个片段里提取所有target targets = re.findall(r'target\d', inner_content) print(targets) # 输出: ['target1', 'target2']
方案二:单个正则(依赖第三方库)
如果一定要用一行正则搞定,Python标准库的re做不到(因为它不支持可变宽度的后行断言),但可以用第三方库regex(功能比标准re强大)。安装后可以这么写:
import regex text = "aa.....target1...target2.....bb...target3...bb" # 断言确保target在aa和第一个bb之间,且中间没有出现过bb targets = regex.findall(r'(?<=aa(?:(?!bb).)*)target\d(?=(?:(?!bb).)*bb)', text) print(targets) # 输出: ['target1', 'target2']
安装方法:pip install regex
为什么你之前的正则不行?
Python标准库的re对后行断言((?<=...))有严格限制:里面的模式必须是固定宽度的,不能用*、+这种可变长度的量词。你之前写的(?<=aa((?!bb).)*?)里,((?!bb).)*?是可变长度的,所以直接报错。
内容的提问来源于stack exchange,提问作者sabu1234
相关产品推荐
相关产品推荐

