在Python中查找列表中的字符串

1 投票
5 回答
553 浏览
提问于 2025-04-16 17:06

你好!

我有一个字符串,里面包含一个邮箱地址,比如说(user@foo.bar.com)。还有一个列表,里面只包含一些域名,比如('bar.com','stackoverflow.com')等等。

我想在这个列表里查找,看看里面是否包含我字符串中的域名。目前我用的代码是这样的:

if tokens[1].partition("@")[2] in domainlist:

在这里,tokens[1]包含邮箱地址,而domainlist是域名的列表。不过你可以看到,tokens[1].partition("@")[2]会返回foo.bar.com,而我的列表里只有域名bar.com

我该怎么做才能让这个判断语句返回真呢?而且因为每秒会有成百上千个邮箱地址进来,所以速度要很快。

5 个回答

1

与其他回答相反,这里 'foo.com' 不会匹配 '@y.afoo.com'

def mailInDomains(mail,domains):

    for domain in domainList:
        dLen = len(domain)
        if mail[-dLen:]==domain and mail[-dLen-1] in ('.','@'):
            return True

    return False
2

如果速度对你来说真的很重要,可以考虑使用像Aho-Corasick这样的算法。网上有很多现成的实现,比如esmreesm,你可以在这里找到:http://code.google.com/p/esmre/

正如@Riccardo Galli提到的,简单的字符串匹配可能会出现一些错误的匹配结果,所以你可以先试试esmre,把相应的正则表达式添加到索引中,像这样index.enter("(^|\.){0}$".format(domain))

4

应该这样工作:

if any(tokens[1].endswith(domain) for domain in domainlist): 

撰写回答