>>> reg = re.compile(r'^\d{1,3}(,\d{3})*$')
>>> str = '42'
>>> reg.search(str).group()
'42'
>>> reg.findall(str)
['']
>>>
python正则表达式
为什么reg.findall
找不到任何内容,但reg.search
适用于上面的这段代码?
答案 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']