正则表达式查找带引号的字符串中的所有大括号

Regex to find all curly brackets within a quoted string

我有一个字符串:

test_str = 'This is the string and it "contains {0} a" few {1} sets of curly brackets'

我想在这个例子中找到{0}没有{1},也就是说,括号本身及其内容,如果仅在一组双引号内。

我已经开始通过匹配双引号中的部分来解决这个问题:

(?<=").*(?=")

参见 https://regex101.com/r/qO0pO2/1

但我很难只匹配 {0} 部分

如何扩展此正则表达式以匹配 {0}

移除管道 | 它会很好用:Live Demo

这里是 {}

之间的多个字符
(?<=)\{[^\}]*\}(?=)

Live Demo


更新:

This 做事 :

".*({[^\}]*\}).*"

您可以尝试单词边界 \Blookarounds- 即

>>>test_str="This is the string and it contains {0} a few {1} sets of curly brackets"
>>>re.findall(r'(?<=\B){.*?}(?=\B)',test_str)
>>>['{0}', '{1}']

看直播DEMO

但是如果你的字符串没有 word boundary 然后尝试 lazy quantifier evaluation

>>>test_str="This is the string and it contains {0} a few {1} sets of curly brackets"
>>>re.findall(r'{.*?}',test_str)
>>>['{0}', '{1}']

看直播DEMO


编辑

如果你只想要 {0} 那么你必须在大括号前使用转义符(\),因为大括号是正则表达式标记 - 尝试如下。

>>>test_str="This is the string and it contains {0} a few {1} sets of curly brackets"
>>>re.findall(r'\{0\}',test_str)
>>>['{0}']

用一个正则表达式可能很难做到,但用两个正则表达式很容易:

from re import findall

# First find all quoted strings...
for quoted in findall(r'"[^"]*"', test_str):
    # ...then find all bracketed expressions
    for match in findall(r'\{[^\}]*\}', quoted):
        print(match)

或单线:

[match for match in findall(r'\{[^\}]*\}', quoted) for quoted in findall(r'"[^"]*"', test_str)]

如果报价是平衡的,您可以使用 lookahead 检查前面的金额是否不平衡。如果您知道只有一个带引号的子字符串,请检查是否只出现一个 " 直到结束 $

{[^}]+}(?=[^"]*"[^"]*$)

See demo。但是,如果可能有任何数量的引用部分,请检查数量是否不均匀,直到结束。

{[^}]+}(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)
  • {[^}]+} 匹配大括号的内容:文字 { 后跟 [^}]+ 一个或多个 non} 直到 }
  • [^"]*" 在前瞻匹配中直到第一个引号
  • (?:[^"]*"[^"]*")*后跟零个或多个平衡,前面是任意数量的非引号
  • [^"]*$ 后跟任意数量的非引号直到结束

See demo at regex101