什么时候在Python Regex中使用re.search而不是re.findall才有意义?

时间:2016-06-05 09:58:07

标签: python regex

我理解在Python中使用re.searchre.findall之间的技术差异,但是有经验的人会解释使用re.search而不仅仅使用re.findall的情况用于正则表达式解析?

1 个答案:

答案 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")