如何编译贪婪模式?.


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}"]

在这里,.*?将进行非贪婪的匹配。因此,从{符号开始,它将所有字符匹配到第一个右大括号}。所以你得到了上面的输出。

溶液:

{(?:{[^{}]*}|[^{}])*}
  • {与文字{符号匹配。

  • (?:..) 称为非捕获组。

  • {[^{}]*}|[^{}]表示匹配一组{....}|任何字符,但不匹配{}[^{}]),

  • (?:{[^{}]*}|[^{}])*零次或更多次。也就是说,一旦字符不匹配,更改有助于在这里来回切换。如果第一个模式与字符不匹配,那么下一个模式将出现并尝试匹配。如果两者不匹配,则控件将转换为以下模式,即}因为我们定义了非捕获组重复零次或多次。

  • } 匹配文本右括号。

最新更新