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

如何编写正则表达式匹配不在单双引号范围内的单词?

解决方案

方案1:适配Python 3.10+,直接匹配(无需后续过滤)

使用PCRE标准的(*SKIP)(*FAIL)语法跳过所有引号包裹内容,直接匹配目标单词:
正则表达式:

(?:'[^']*'|"[^"]*")(*SKIP)(*FAIL)|\b[^\d\W]+\b

测试代码:

import re
a = "big mouse eats cheese? \"non-detected string\" 'non-detected string too' hello guys"
some_regex = r"""(?:'[^']*'|"[^"]*")(*SKIP)(*FAIL)|\b[^\d\W]+\b"""
print(re.findall(some_regex, a))

输出结果完全符合预期:

['big', 'mouse', 'eats', 'cheese', 'hello', 'guys']

方案2:兼容所有Python版本,轻量过滤即可

如果需要兼容Python 3.10以下版本,可以使用分组捕获+空值过滤的方式,同样不需要提前删除引号内容:
正则表达式:

(?:'[^']*'|"[^"]*")|(\b[^\d\W]+\b)

测试代码:

import re
a = "big mouse eats cheese? \"non-detected string\" 'non-detected string too' hello guys"
some_regex = r"""(?:'[^']*'|"[^"]*")|(\b[^\d\W]+\b)"""
res = [item for item in re.findall(some_regex, a) if item]
print(res)

输出结果和上述方案完全一致。


正则逻辑说明

  1. 优先匹配所有单引号/双引号包裹的完整内容,这部分内容要么被(*SKIP)(*FAIL)标记为跳过,要么不会进入捕获分组
  2. 剩余未被匹配的内容走单词匹配逻辑,只会命中引号外的目标单词
  3. 全程不需要提前调用re.sub()删除引号内容,符合需求要求

内容的提问来源于stack exchange,提问作者Ibrahim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 23:15:01