[英]python - regex pattern is a large number of items, best practice?
我正在这里寻找专家建议。 我在数据库中有一个字符串列表,例如“ MD”,“ PHD”,“ MR”等各种称呼。 它有几百行,我按特定顺序收到(MD比MR更重要)。 我还有一系列的人员对象,这些对象将进行迭代,并且需要一种非常有效的匹配方法。 我尝试了两个,也许没有其他方法了。
我的第一次尝试是当我收到列表时,重新编译每个列表并将它们放入列表中。 然后...
theregexlist = ["MR", "DR", "MRS" ... "MISS", "PHD"] #several hundred
personname = "MR JOEY SMITH" #other examples are similar like "BOBBY DR MD JOE"
for theregex in theregexlist:
if re.search(theregex, personname):
do stuffs....
break #since my list is ordered, I only want the first match
确实有效。 我还尝试循环regexlist并构建一个巨大的匹配正则表达式,以捕获paran,对其进行重新编译,然后:
hugeregex = re.compile("(?:(MR)|(MR)|(PHD)| ... |(DR)|(MD))")
personname = "FRED DR FLINTSTONE"
maybematch = re.search(hugeregex, personname)
if maybematch:
print (maybematch.group(0))
是否有某种我没有想到的映射,杠杆键或迭代函数会更有效? 任何和所有的想法表示赞赏! 即使是“是的,它只会变慢,请尝试使用timeit来查看哪个更快”,然后我就可以停止搜索了:)谢谢!
具有所有“粒子”(例如“ MR”,“ MS”等)的“大” RegEx会更高效,因为它只会被编译一次。 并且减少了函数调用(这是一种优化)。
如果微粒中包含特殊字符,则可能需要使用re.escape
对其进行re.escape
。
您可以编译RegEx并获取对search
方法的引用。
这是一个例子:
import re
particules = ["MR", "DR", "MRS", "MISS", "PHD"]
regex = r"\b(?:" + "|".join(map(re.escape, particules)) + r")\b"
search_any_particule = re.compile(regex, flags=re.IGNORECASE).search
personname = "FRED DR FLINTSTONE"
mo = search_any_particule(personname)
if mo:
print(mo.group())
您得到:'DR'。
编辑
确保实施高效的最佳方法是对其进行概要分析 。 为此,您可以使用cProfile
库。
例如:
def find_particule(personname):
mo = search_any_particule(personname)
if mo:
return mo.group()
return None
import cProfile
cProfile.runctx('for i in range(1000000): find_particule("FRED DR FLINTSTONE")', globals(), locals())
分析器将为您提供以下信息:
3000003 function calls in 2.110 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.353 0.353 2.110 2.110 <string>:1(<module>)
1000000 0.495 0.000 1.757 0.000 python:10(find_particule)
1 0.000 0.000 2.110 2.110 {built-in method builtins.exec}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1000000 0.185 0.000 0.185 0.000 {method 'group' of '_sre.SRE_Match' objects}
1000000 1.078 0.000 1.078 0.000 {method 'search' of '_sre.SRE_Pattern' objects}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.