Python非贪婪正则匹配特定字符串间内容及长度过滤问题
Python正则提取关键词间隐藏消息的解决方案
提取所有符合要求的隐藏内容
你之前的正则只排除了起始关键词@9>,没有排除结束关键词>9@,导致匹配逻辑存在漏洞。正确的正则需要同时确保提取的内容中不包含这两个关键词,且能处理连续出现的起始关键词场景:
import re text = "Hello @9>ruur>9@ dafa @9>ruerur>9@ @>ru@9>ruour>9@ur>@, @9> @9> @9> @9>@9>opp>9@@9>@9>iiiii>9@@9>@9>@9>@9> >9@>9@>9@>9@9>9@9>@" # 核心正则:确保内容中不包含@9>或>9@ pattern = r"@9>((?:(?!@9>|>9@).)*)>9@" matches = re.findall(pattern, text) print(matches)
运行结果:['ruur', 'ruerur', 'ruour', 'opp', 'iiiii', ' ']
正则逻辑说明:
@9>精准匹配起始标记(?:(?!@9>|>9@).)*非捕获组,通过正向否定预查确保每一个字符都不会触发@9>或>9@,同时匹配任意字符,实现严格的非贪婪且无关键词的内容提取>9@精准匹配结束标记
提取长度≥n的消息
有两种实现方式,按需选择:
1. 正则内直接限制长度
比如要提取长度≥3的内容,修改正则如下:
n = 3 pattern = r"@9>((?:(?!@9>|>9@).){" + str(n) + ",})>9@" # 或者直接写死长度,比如n=3时:r"@9>((?:(?!@9>|>9@).){3,})>9@" matches = re.findall(pattern, text)
2. 提取后过滤(更灵活)
先提取所有结果,再通过列表推导式过滤长度符合要求的内容:
n = 3 filtered_matches = [match for match in matches if len(match) >= n]
这种方式适合需要动态调整长度阈值或添加其他过滤条件的场景。
内容的提问来源于stack exchange,提问作者Miguel Garcia
相关产品推荐
相关产品推荐

