如何编写正则捕获单双引号内文本(含嵌套引号)
解决单/双引号包裹文本的正则捕获问题
需求说明
需要编写正则表达式,捕获满足以下条件的文本:
- 被单引号或双引号包裹
- 闭合引号与开头引号类型一致
- 支持嵌套不同类型的引号(比如单引号内包含未转义的双引号)
输入示例:
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
相关产品推荐
相关产品推荐

