检查字符串是否以一组字符串之一开头的有效方法

2024-09-28 21:50:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要匹配一个字符串,看看它是否以大约40个字符串中的一个开始,这个方法被调用了很多次。在

目前确实如此

for pref, newval in list_of_prefixes:
    if oldval.startswith(pref):
         return newval
return oldval

然而,考虑到它被调用了很多次,所以尽可能的高效是有意义的。我可以确保前缀列表已经排序,然后在pref>;oldval后立即退出循环,但这似乎没有什么好处。在

目前最大数量的输入值落在两个前缀之间,所以我可以显式地对此进行测试,或者以相反的顺序进行搜索,但是尽管这对于现在的数据集是有效的,但是如果数据集发生变化,它的效率可能会降低。在

最初,只有一个可能的前缀,所以性能问题可能不那么重要。在

我看着string.startswith(tuple())但这似乎只会使编写更容易,而且它不会告诉我哪个元组匹配,所以如果有匹配项,我必须进行两次检查。在


Tags: of数据方法字符串inforreturnif
1条回答
网友
1楼 · 发布于 2024-09-28 21:50:37

对于已编译的正则表达式,我希望当您拥有的不仅仅是几个字符串时,编译正则表达式的开销会自动得到补偿。基本上,编译后的正则表达式是一个自动机,如果前缀不是自动机识别的前缀,它会很快用完可遍历路径。尤其是如果所有匹配项都锚定在字符串的开头,那么当没有匹配项时,它会很快失败。在

import re

prefixes = ['foo', 'bar', 'baz']
rx = re.compile(''.join(['^(?:', '|'.join(prefixes), ')']))
for line in input:
    match = rx.match(line)
    if match:
        matched = match.group(0)

如果您需要一个更复杂的正则表达式(例如,右括号后面有一个尾随上下文的正则表达式),您将希望使用正则分组括号(而不是非分组{},而是fetch{}。在

以下是将前缀映射到替换的字典:

^{pr2}$

实际上,正如评论中所指出的,^与{a1}不是严格必要的。在

相关问题 更多 >