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

如何编写正则捕获单双引号内文本(含嵌套引号)

解决单/双引号包裹文本的正则捕获问题

需求说明

需要编写正则表达式,捕获满足以下条件的文本:

  • 被单引号或双引号包裹
  • 闭合引号与开头引号类型一致
  • 支持嵌套不同类型的引号(比如单引号内包含未转义的双引号)

输入示例:

input_str = r"'\'this text must be captured' \"this one too\" 'and this \"nested\" too' 'this should not be captured\"'"

预期结果:

['this text must be captured', 'this one too', 'and this "nested" too']

现有方案的问题分析

Pattern 1

pattern = r'"(.*?)"|\'(.*?)\''
pattern = r'"([^"]*)"|\'([^\']*)\''

问题:两个分支各自有独立的捕获组,每次匹配只会命中其中一个分支,因此返回结果是包含空值的元组列表,无法直接得到纯净的目标文本。

Pattern 2

pattern = r'(?P<unquoted>(?:\"(?:\\.|[^\"\\])*\"|\'(?:\\.|[^\'\\])*\'))'

问题:捕获的是包含首尾引号的整个字符串,而非引号内部的目标文本,不符合需求。

正确的正则方案

使用反向引用匹配同类型的首尾引号,并单独捕获内部内容:

import re

input_str = r"'\'this text must be captured' \"this one too\" 'and this \"nested\" too' 'this should not be captured\"'"
pattern = r'(?<!\\)(["\'])((?:\\.|[^\\\1])*)\1'

result = [match.group(2) for match in re.finditer(pattern, input_str)]
print(result)

输出结果:

['this text must be captured', 'this one too', 'and this "nested" too']

正则解析

  • (?<!\\):负向断言,确保起始引号未被反斜杠转义(避免误匹配\"abc"这类转义引号开头的内容)
  • (["\']):捕获起始的单/双引号,存入捕获组1,用于后续反向引用匹配闭合引号
  • ((?:\\.|[^\\\1])*):捕获引号内部的目标文本:
    • \\.:匹配任意转义字符(比如\'、\")
    • [^\\\1]:匹配不是反斜杠且不是起始引号的任意字符(允许嵌套不同类型的引号)
    • (?:...):非捕获组,将两种规则组合后重复匹配
  • \1:反向引用捕获组1的内容,确保闭合引号与起始引号类型一致

关键优势

  • 自动过滤不匹配的引号对(比如开头单引号、结尾双引号的情况不会被捕获)
  • 直接获取引号内部的纯净文本,无需额外去引号处理
  • 兼容转义引号和跨类型嵌套引号的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:38:25