Python根据一个大的单词列表从字符串中提取单词
首先,我有一个很大的单词列表:Python根据一个大的单词列表从字符串中提取单词,python,regex,Python,Regex,首先,我有一个很大的单词列表: words = ['about', 'black', 'red', ...] # nums: 20000+ 然后,给定一个字符串,例如: s = 'blackingabouthahah' 我想得到['black','about'] 我尝试使用regex来实现这一点: pattern = re.compile('|'.join(words)) print pattern.findall(s) 这是可行的,但我担心这种方法的速度和内存使用 有更好的解决方案吗?
words = ['about', 'black', 'red', ...] # nums: 20000+
然后,给定一个字符串,例如:
s = 'blackingabouthahah'
我想得到['black','about']
我尝试使用regex来实现这一点:
pattern = re.compile('|'.join(words))
print pattern.findall(s)
这是可行的,但我担心这种方法的速度和内存使用
有更好的解决方案吗?您可以对
使用非正则表达式方法。使用理解查找:
words = ['about', 'black', 'red']
s = 'blackingabouthahah'
print [x for x in words if s.find(x)>-1]
看
这将仅输出列表中出现的唯一术语。如果需要对所有事件进行计数,请执行以下操作:
words = ['about', 'black', 'red']
s = 'blackingabouthahahabout'
print [s.count(x) for x in words]
因为我看不出第一个about
和第二个about
之间有什么区别。请参阅。如果您只想打印,我这里有一个解决方案
import re
words = ['about', 'black', 'red',]
s = 'dsjhdgblackingabouthahah'
for items in words:
if re.search (items,s):
print items
如果您希望在新列表中显示结果,可以尝试以下操作:
import re
words = ['about', 'black', 'red',]
s = 'dsjhdgblackingabouthahah'
mylist = []
for items in words:
if re.search (items,s):
mylist.append( items)
print mylist
你的意思是pattern=re.compile(“|”).join(words))
?除非你指定所有要求,否则这个问题没有最好的解决方案。我可以想出一个分而治之的解决方案,其中每个工作人员迭代地处理搜索的一部分。@JamesMills我可以想出几个解决方案,但我不知道他们是否会比OP的解决方案更好,因为他没有提供任何细节。例如,如果字符串不长,那么最好生成所有子字符串并在单词列表中执行查找。@Alik我同意;没有细节,很难提供一个最佳的解决方案!您的解决方案也存在同样的问题,即不打印多个事件(请参阅我上面的评论)s='BlackingabouthahahahBlackxyz'
只打印一次black
。没有明确要求在Pynchia中包含重复元素。相反,效率和内存优化是既定的目标,这意味着停止比赛并使用生成器将更加有效。他建议的解决方案使用模式。findall(s)
,打印所有出现的情况。我理解,他想要一个高效的等价物。对:他担心内存效率,对所有事件都不感兴趣。findall是这样的,它不会在“|”子句中的第一场比赛后中断。@Pynchia,但OP没有在问题中明确说明这一点。因此,我不明白为什么答案被否决,而不是问题