如何用re.findall提取标记间字符串并排除指定内容?
正则匹配问题解决
问题详情
- 给定字符串:
txt='thisis a red picture;thisis a yellow picture;thisis a good picture haha picture;thisis a bad picture haha picture;' - 当前使用代码:
import re mycode=re.findall('thisis(.+?)picture',txt,re.DOTALL) - 当前输出结果:
[' a red ', ' a yellow ', 'a bad',' a good '] - 期望输出结果:
[' a red ', ' a yellow '] - 核心要求:
- 提取
thisis与picture之间的文本,但排除包含a good或a bad的匹配项 - 必须使用
re.findall方法
- 提取
解决方法
利用正则的负向前瞻断言过滤不符合条件的匹配,修改后的代码如下:
import re txt='thisis a red picture;thisis a yellow picture;thisis a good picture haha picture;thisis a bad picture haha picture;' # 带负向前瞻的正则,排除含a good/a bad的情况 matches = re.findall(r'thisis(?!.*(a good|a bad))(.+?)picture', txt, re.DOTALL) # 提取捕获组中的目标内容 final_result = [match[0] for match in matches] print(final_result)
正则逻辑说明
(?!.*(a good|a bad)):负向前瞻规则,确保thisis后续的文本里不包含a good或a bad,直接过滤掉这类不符合要求的匹配(.+?):非贪婪匹配模式,精准捕获thisis到最近的picture之间的文本- 由于
re.findall会返回所有捕获组的结果,所以最后需要从每个元组中提取第一个元素,就是我们要的目标文本
运行代码后,输出结果即为期望的:[' a red ', ' a yellow ']
内容的提问来源于stack exchange,提问作者Michael Chen
相关产品推荐
相关产品推荐

