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

时间:2019-02-14 10:38:19

标签: python regex

我有一个像这样的字符串:

myStr = "abcd123[ 45][12] cd [67]"

我想获取'['和']'标记之间的所有子字符串。 我正在使用findall来获取相同的内容,但我得到的只是在firsr'['和']'最后一个字符之间的所有内容。

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

我在这里做什么错了?

2 个答案:

答案 0 :(得分:3)

这可能会被标记为重复,但是这里的简单解决方法是使您的点变得懒惰:

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

[' 45', '12', '67']

这里.+?表示消耗所有内容,直到先点击 或最接近的方括号。您当前的模式正在消耗一切,直到最后一个 last 结束。

另一个在逻辑上完全相同的模式也可以使用\[([^\]+)\]

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

答案 1 :(得分:1)

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

您有两个选择:通过使用.+?来使选择器变为非贪婪的,该选择器可以选择字符数最少的 ,或者通过使用来显式地将[]排除在匹配之外[^\[\]]+而不是.+

(在这种情况下,这两个选项的效果都差不多。虽然如果结尾定界符是较长的字符串而不是单个字符,则“ non-greedy”选项更可取,因为较长的字符串更难排除。 )