![](/img/trans.png)
[英]Searching exact match of a list of strings inside a list of lists in Python
[英]Searching a string for an exact match from a list in Python
我正在开发一个项目,从我的关注者列表中搜索特定用户的Twitter流并转发它们。 下面的代码工作正常,但如果字符串出现在单词的一侧(例如,如果所需的字符串只是“man”但是他们写了“manager”,它会被转发)。 我仍然对python很新,但我的预感是RegEx将是要走的路,但到目前为止,我的尝试已证明是无用的。
if tweet["user"]["screen_name"] in friends:
for phrase in list:
if phrase in tweet["text"].lower():
print tweet
api.retweet(tweet["id"])
return True
由于您只想匹配整个单词,因此让Python执行此操作的最简单方法是将推文文本拆分为单词列表,然后使用in
测试每个单词是否存在。
您可以使用优化,因为位置并不重要:通过从单词列表构建一个集合,您可以更快地进行搜索(技术上,O(1)而不是O(n)),因为集合使用了快速散列访问dicts(谢谢Tim Peters,也是The Zen of Python的作者 )。
完整的解决方案是:
if tweet["user"]["screen_name"] in friends:
tweet_words = set(tweet["text"].lower().split())
for phrase in list:
if phrase in tweet_words:
print tweet
api.retweet(tweet["id"])
return True
这不是一个完整的解决方案。 真的,你应该照顾清除前导和尾随标点符号等事情。 您可以编写一个函数来执行此操作,并使用tweet文本作为参数调用它,而不是使用.split()
方法调用。
鉴于优化,我发现Python中的迭代可以完全避免,如果短语也是一个集合(迭代仍然会发生,但是以C速度而不是Python速度)。 因此,在下面的代码中,假设您在初始化期间执行了代码
tweet_words = set(l.lower() for l in list)
顺便说一句, list
是一个变量的可怕名称,因为通过使用它你可以使Python列表类型在其通常的名称下不可用(尽管你仍然可以使用type([])
等技巧获得它。 也许最好把它word_list
或其他更有意义的东西,而不是现有的名字。 您必须根据自己的需要调整此代码,这只是为了给您提供想法。 请注意, tweet_words
只需设置一次。
list = ['Python', 'Perl', 'COBOL']
tweets = [
"This vacation just isn't worth the bother",
"Goodness me she's a great Perl programmer",
"This one slides by under the radar",
"I used to program COBOL but I'm all right now",
"A visit to the doctor is not reported"
]
tweet_words = set(w.lower() for w in list)
for tweet in tweets:
if set(tweet.lower().split()) & tweet_words:
print(tweet)
如果要使用正则表达式执行此操作,请查找格式为\\b<string>\\b
。 在你的情况下,这将是:
pattern = re.compile(r"\bman\b")
if re.search(pattern, tweet["text"].lower()):
#do your thing
\\b
在正则表达式中查找单词边界。 因此,使用它为模板添加前缀和后缀将仅匹配模式。 希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.