import re
s = "{'key': 1234}{'test': {xyz}123}"
regex = re.compile("{.+?}")
result = regex.findall(s)
print result
结果是["{'key': 1234}", "{'test': {xyz}"]
,
但我希望结果是["{'key': 1234}", "{'test': {xyz}123"]
,
因此,将re.compile("{.+?}")
更改为re.compile("{.+}")
,
现在结果是["{'key': 1234}{'test': {xyz}123}"]
,
但我不希望。
我建议你像这样改变你的正则表达式,
>>> s = "{'key': 1234}{'test': {xyz}123}"
>>> re.findall(r'{(?:{[^{}]*}|[^{}])*}', string)
["{'key': 1234}", "{'test': {xyz}123}"]
贪婪和非贪婪正则表达式的问题。
>>> re.findall(r'{.*}', s)
["{'key': 1234}{'test': {xyz}123}"]
在这里.*
贪婪,它尽可能地匹配所有角色,直到最后一}
。因此,匹配是从第一个{
到最后一个}
符号。所以你得到了上面的输出。
>>> re.findall(r'{.*?}', s)
["{'key': 1234}", "{'test': {xyz}"]
在这里,.*?
将进行非贪婪的匹配。因此,从{
符号开始,它将所有字符匹配到第一个右大括号}
。所以你得到了上面的输出。
溶液:
{(?:{[^{}]*}|[^{}])*}
{
与文字{
符号匹配。(?:..)
称为非捕获组。{[^{}]*}|[^{}]
表示匹配一组{....}
或|
任何字符,但不匹配{
或}
([^{}]
),(?:{[^{}]*}|[^{}])*
零次或更多次。也就是说,一旦字符不匹配,更改有助于在这里来回切换。如果第一个模式与字符不匹配,那么下一个模式将出现并尝试匹配。如果两者不匹配,则控件将转换为以下模式,即}
因为我们定义了非捕获组重复零次或多次。}
匹配文本右括号。