python - 正则表达式为什么`findall`什么都没找到,但`search`有效吗?

时间:2017-08-19 14:32:00

标签: python regex

>>> reg = re.compile(r'^\d{1,3}(,\d{3})*$')
>>> str = '42'
>>> reg.search(str).group()
'42'
>>> reg.findall(str)
['']
>>> 

python正则表达式 为什么reg.findall找不到任何内容,但reg.search适用于上面的这段代码?

1 个答案:

答案 0 :(得分:5)

如果正则表达式中有捕获组(用括号括起来),findall将返回捕获组的匹配项;在您的情况下,捕获的组匹配一个空字符串;如果要返回整个匹配,可以使用?:进行非捕获;另一方面,re.search忽略了捕获组。这些反映在文档中:

re.findall:

  

返回字符串中所有非重叠的模式匹配,作为列表   字符串。从左到右扫描字符串,并返回匹配项   按顺序找到。 如果模式中存在一个或多个组,   返回一个组列表; 如果是模式,这将是一个元组列表   有不止一个小组。

re.search:

  

扫描字符串,查找常规的第一个位置   表达式模式产生匹配,并返回相应的   MatchObject实例。如果字符串中没有位置匹配则返回None   模式;请注意,这与查找零长度不同   匹配字符串中的某个点。

import re
reg = re.compile(r'^\d{1,3}(?:,\d{3})*$')
s = '42'
reg.search(s).group()
​# '42'

reg.findall(s)
# ['42']