我想匹配包含在一对单引号或双引号中的字符串。我这样写了一个正则表达式模式:
pattern = r"([\"\'])[^\1]*\1"
mytext = '"bbb"ccc"ddd'
re.match(pattern, mytext).group()
预期的输出是:
"bbb"
但是,这是输出:
"bbb"ccc"
有人能解释一下上面的模式有什么问题吗?我用谷歌搜索,发现正确的模式是:
pattern = r"([\"\'])[^\1]*?\1"
但是,我不明白为什么一定要用?。
请您参考如下方法:
在你的正则表达式中
([\"'])[^\1]*\1
字符类 仅用于匹配一个字符。所以您对 [^\1] 的使用是不正确的。想一想,如果第一个捕获组中有多个字符会发生什么情况。
你可以像这样使用负前瞻
(["'])((?!\1).)*\1
或只是交替
(["'])(?:[^"'\\]+|\\.)*\1
或
(?<!\\)(["'])(?:[^"'\\]+|\\.)*\1
如果你想确保 "b\"ccc" 不匹配字符串 bb\"b\"ccc"
