我运行以下脚本
a = r'[abc] [abc] [y78]'
paaa = re.compile(r'\[ab.*]')
paaa.findall(a)
我获得了
['[abc] [abc] [y78]']
为什么缺少'[abc]'? '[abc]'也显然与模式匹配。 python3 re.findall函数中是否存在任何错误?
说明:
抱歉,paaa
应该是paaa = re.compile(r'\[ab.*\]')
我正在寻找的东西将会返回
['[abc]', '[abc]', '[abc] [abc]', '[abc] [abc] [y78]']
基本上,任何子串都与模式匹配。
答案 0 :(得分:2)
在.
中重复的[ab.*]
是 greedy -它会匹配尽可能多的字符,以使这些字符后跟一个]
。因此,第一个[
和最后一个]
之间的所有内容都是匹配的。
改为使用惰性重复,并使用.*?
:
a = r'[abc] [abc] [y78]'
paaa = re.compile(r'\[ab.*?]')
print(paaa.findall(a))
['[abc]', '[abc]']
答案 1 :(得分:1)
您也应转义右方括号,并在正则表达式中使用非贪婪中继器*?
:
import re
a = r'[abc] [abc] [y78]'
paaa = re.compile(r'\[ab.*?\]')
print(paaa.findall(a))
这将输出:
['[abc]', '[abc]']