我有一个像这样的字符串:
myStr = "abcd123[ 45][12] cd [67]"
我想获取'['和']'标记之间的所有子字符串。 我正在使用findall来获取相同的内容,但我得到的只是在firsr'['和']'最后一个字符之间的所有内容。
print re.findall('\[(.+)\]', myStr)
我在这里做什么错了?
答案 0 :(得分:3)
这可能会被标记为重复,但是这里的简单解决方法是使您的点变得懒惰:
print re.findall('\[(.+?)\]', myStr)
[' 45', '12', '67']
这里.+?
表示消耗所有内容,直到先点击 或最接近的方括号。您当前的模式正在消耗一切,直到最后一个 last 结束。
另一个在逻辑上完全相同的模式也可以使用\[([^\]+)\]
:
print re.findall('\[([^\]]+)\]', myStr)
答案 1 :(得分:1)
.+
很贪婪,它会选择尽可能多的字符,包括其他[]
个字符。
您有两个选择:通过使用.+?
来使选择器变为非贪婪的,该选择器可以选择字符数最少的 ,或者通过使用来显式地将[]
排除在匹配之外[^\[\]]+
而不是.+
。
(在这种情况下,这两个选项的效果都差不多。虽然如果结尾定界符是较长的字符串而不是单个字符,则“ non-greedy”选项更可取,因为较长的字符串更难排除。 )