我想匹配一对单引号或双引号中包含的字符串。我写了一个正则表达式模式:
pattern = r"([\"\'])[^\1]*\1"
mytext = '"bbb"ccc"ddd'
re.match(pattern, mytext).group()
预期输出为:
"bbb"
然而,这是输出:
"bbb"ccc"
有人可以解释上述模式的错误吗?我用Google搜索并找到了正确的模式:
pattern = r"([\"\'])[^\1]*?\1"
但是,我不明白为什么必须使用?
。
答案 0 :(得分:3)
你应该使用负前瞻断言。我假设输入字符串中没有任何转义引号。
READ_SIG
答案 1 :(得分:3)
在你的正则表达式
([\"'])[^\1]*\1
字符类 仅用于匹配一个字符。因此,您对[^\1]
的使用不正确。想想,如果第一个捕获组中有多个字符,会发生什么。
你可以使用像这样的负向前瞻
(["'])((?!\1).)*\1
或只需更改
(["'])(?:[^"'\\]+|\\.)*\1
或强>
(?<!\\)(["'])(?:[^"'\\]+|\\.)*\1
如果您想确保"b\"ccc"
与字符串bb\"b\"ccc"
答案 2 :(得分:2)