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

如何用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 ']
  • 核心要求:
    1. 提取thisis与picture之间的文本,但排除包含a good或a bad的匹配项
    2. 必须使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:39:50