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没有在问题中明确说明这一点。因此,我不明白为什么答案被否决,而不是问题