在Python正则表达式中使用re.search over re.findall什么时候有意义?

在Python正则表达式中使用re.search over re.findall什么时候有意义?,python,regex,Python,Regex,我理解在Python中使用re.search和re.findall之间的技术区别,但是有经验的人能否解释一下,在哪些情况下,您可能会使用re.search而不仅仅是使用re.findall进行正则表达式解析?来自文档 重新搜索(模式、字符串、标志=0):-扫描字符串以查找 正则表达式模式生成 匹配,并返回相应的MatchObject实例。如果是,则返回None 字符串中没有与模式匹配的位置;请注意,这是 不同于在中的某个点上查找零长度匹配 绳子 i) 如果您只想查找字符串中是否存在模式,可以使用

我理解在Python中使用
re.search
re.findall
之间的技术区别,但是有经验的人能否解释一下,在哪些情况下,您可能会使用
re.search
而不仅仅是使用
re.findall
进行正则表达式解析?

来自文档

重新搜索(模式、字符串、标志=0):-扫描字符串以查找 正则表达式模式生成 匹配,并返回相应的MatchObject实例。如果是,则返回None 字符串中没有与模式匹配的位置;请注意,这是 不同于在中的某个点上查找零长度匹配 绳子

i) 如果您只想查找字符串中是否存在模式,可以使用
re.search
例如

a+ in string abcdaa
将告诉字符串
abcaa
中是否存在一个或多个
a
。如果找到匹配项,它将返回找到字符串的MatchObject,否则
None
。它将不会检查该模式是否再次出现。因此,如果您使用
re.search('a+','abcdaa')。组(0)
则字符串
abcdaa

另一方面,
re.findall
将返回在字符串中找到的所有匹配项,如字符串
abcdaa
[a,aa]
。因此,我们可以说
re.findall
是python使用
g
标志查找所有匹配项的方法

ii)有人可能会说,为什么不使用
re.findall
查找所有匹配项,如果列表非空,那么我们可以说该模式存在

在这种情况下,
re.findall
将比
re.search
慢(很多)

比较(处理器-英特尔®核心™ i5-5200U CPU@2.20GHz×4,内存-7.7Gib

在大小为10000000的字符串上,使用以下代码

import re
import time

st = "".join(str(n) for n in range(10000000))

start_time = time.time()
re.search(r"1+", st)
first_time = time.time()
print("Time taken by re.search = ", first_time - start_time, "seconds")

re.findall(r"1+", st)
second_time = time.time()
print("Time taken by re.findall = ", second_time - first_time, "seconds")
产量为

Time taken by re.search =  0.00011801719665527344 seconds
Time taken by re.findall =  1.7739462852478027 seconds

因此,如果我们只想知道字符串中是否存在模式,使用
re.search

re.findall
可以理解为python处理全局匹配的方式。如果您只想找出字符串中存在模式的位置,可以使用
re.search
re.search
=“找到第一个匹配”,<代码> Re.Field=“查找所有匹配”,谢谢你的回答,这也给了我更多的考虑。“McLeodx很高兴帮助你,我认为你在第二个打印语句中指的是代码> Re.FundLo/<代码>。