正则表达式查找带引号的字符串中的所有大括号
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
这里是 {}
之间的多个字符
(?<=)\{[^\}]*\}(?=)
更新:
This 做事 :
".*({[^\}]*\}).*"
您可以尝试单词边界 \B
和 lookarounds
- 即
>>>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}
直到 }
[^"]*"
在前瞻匹配中直到第一个引号
(?:[^"]*"[^"]*")*
后跟零个或多个平衡,前面是任意数量的非引号
[^"]*$
后跟任意数量的非引号直到结束
我有一个字符串:
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
这里是 {}
(?<=)\{[^\}]*\}(?=)
更新:
This 做事 :
".*({[^\}]*\}).*"
您可以尝试单词边界 \B
和 lookarounds
- 即
>>>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}
直到}
[^"]*"
在前瞻匹配中直到第一个引号(?:[^"]*"[^"]*")*
后跟零个或多个平衡,前面是任意数量的非引号[^"]*$
后跟任意数量的非引号直到结束