Python 以特殊字符作为标记搜索多个子字符串

Python 以特殊字符作为标记搜索多个子字符串,python,regex,Python,Regex,我有一个字符串,比如: myStr = "abcd123[ 45][12] cd [67]" 我想获取“[”和“]”标记之间的所有子字符串。 我正在使用findall获取相同的字符,但我得到的是第一个“[”和“]”最后一个字符之间的所有字符 print re.findall('\[(.+)\]', myStr) 我在这里做错了什么?这可能会被标记为重复,但这里的简单修复方法就是让你的点变懒: print re.findall('\[(.+?)\]', myStr) [' 45', '12'

我有一个字符串,比如:

myStr = "abcd123[ 45][12] cd [67]"
我想获取“[”和“]”标记之间的所有子字符串。 我正在使用findall获取相同的字符,但我得到的是第一个“[”和“]”最后一个字符之间的所有字符

print re.findall('\[(.+)\]', myStr)

我在这里做错了什么?

这可能会被标记为重复,但这里的简单修复方法就是让你的点变懒:

print re.findall('\[(.+?)\]', myStr)

[' 45', '12', '67']
这里的
+?
意味着消耗一切,直到击中第一个或最近的方括号。您当前的模式正在消耗一切,直到最后一个结束方括号

另一个在逻辑上相同的模式也是有效的,
\[([^\]+)\]

print re.findall('\[([^\]]+)\]', myStr)

+
是贪婪的,它会选择尽可能多的字符,包括其他
[]
字符

您有两种选择:通过使用选择尽可能少的字符数的
使选择器非贪婪,或者通过使用
[^\[\]+
而不是
+
从匹配中显式排除
[]


(在本例中,这两个选项的效果大致相同。但如果结尾分隔符是较长的字符串而不是单个字符,则“非贪婪”选项更可取,因为较长的字符串更难排除。)

请您编辑您的问题,并解释一下
的变化是什么?实际上,您的第二个建议可能“更好”,因为它应该适用于几乎所有的正则表达式引擎,而lazy dot可能不适用于所有的引擎。