我需要匹配一个字符串,看看它是否以大约40个字符串中的一个开始,这个方法被调用了很多次。在
目前确实如此
for pref, newval in list_of_prefixes:
if oldval.startswith(pref):
return newval
return oldval
然而,考虑到它被调用了很多次,所以尽可能的高效是有意义的。我可以确保前缀列表已经排序,然后在pref>;oldval后立即退出循环,但这似乎没有什么好处。在
目前最大数量的输入值落在两个前缀之间,所以我可以显式地对此进行测试,或者以相反的顺序进行搜索,但是尽管这对于现在的数据集是有效的,但是如果数据集发生变化,它的效率可能会降低。在
最初,只有一个可能的前缀,所以性能问题可能不那么重要。在
我看着string.startswith(tuple())但这似乎只会使编写更容易,而且它不会告诉我哪个元组匹配,所以如果有匹配项,我必须进行两次检查。在
对于已编译的正则表达式,我希望当您拥有的不仅仅是几个字符串时,编译正则表达式的开销会自动得到补偿。基本上,编译后的正则表达式是一个自动机,如果前缀不是自动机识别的前缀,它会很快用完可遍历路径。尤其是如果所有匹配项都锚定在字符串的开头,那么当没有匹配项时,它会很快失败。在
如果您需要一个更复杂的正则表达式(例如,右括号后面有一个尾随上下文的正则表达式),您将希望使用正则分组括号},而是fetch{}。在
(
而不是非分组{以下是将前缀映射到替换的字典:
^{pr2}$实际上,正如评论中所指出的,
^
与{a1}不是严格必要的。在相关问题 更多 >
编程相关推荐