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

alw*_*slz 0 python regex

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

python regex为什么reg.findall一无所获,但reg.search在上面的这段代码中工作?

Psi*_*dom 5

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

re.findall:

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

研究:

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

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

reg.findall(s)
# ['42']
Run Code Online (Sandbox Code Playgroud)