我理解在Python中使用re.search
和re.findall
之间的技术差异,但是有经验的人会解释使用re.search
而不仅仅使用re.findall
的情况用于正则表达式解析?
答案 0 :(得分:2)
来自文档
re.search(pattern,string,flags = 0): - 扫描字符串查找 正则表达式模式生成的第一个位置 匹配,并返回相应的MatchObject实例。如果,则返回无 字符串中没有位置与模式匹配;请注意这是 不同于在某个点找到零长度匹配 字符串。
i)如果您只想查找字符串中是否存在模式,可以使用re.search
例如
a+ in string abcdaa
将判断字符串a
中是否存在一个或多个abcaa
。如果找到匹配项,它将返回一个MatchObject,否则找到该字符串None
。它不会检查模式的任何进一步发生。因此,如果您使用re.search('a+', 'abcdaa').group(0)
,则只能获得字符a
的{{1}}
另一方面,abcdaa
将返回字符串中找到的所有匹配项,例如字符串re.findall
的{{1}}。所以,我们可以说[a, aa]
是使用abcdaa
标志的python方式,它可以找到所有匹配项。
ii)有人可能会争辩说为什么不使用re.findall
来查找所有匹配项,如果列表非空,那么我们可以说模式存在。
在这种情况下,g
将比({em> )慢re.findall
。
比较(处理器 - 英特尔®酷睿™i5-5200U CPU @ 2.20GHz×4 ,内存 - 7.7 GiB )
在大小为re.findall
的字符串上,使用以下代码
re.search
输出
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")
。