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可能不适用于所有的引擎。