在Python中查找列表中的字符串
你好!
我有一个字符串,里面包含一个邮箱地址,比如说(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这样的算法。网上有很多现成的实现,比如esmre
和esm
,你可以在这里找到: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):