Python RegEx,匹配字符串中的单词并获取计数

时间:2011-09-08 08:32:58

标签: python regex

我希望将一个单词列表与一个字符串匹配,并获得匹配的单词数量。

现在我有了这个:

import re
words = ["red", "blue"]
exactMatch = re.compile(r'\b%s\b' % '\\b|\\b'.join(words), flags=re.IGNORECASE)
print exactMatch.search("my blue cat")
print exactMatch.search("my red car")
print exactMatch.search("my red and blue monkey")
print exactMatch.search("my yellow dog")

我当前的正则表达式将与前3个匹配,但我想知道列表words中与传递给search的字符串匹配的单词数量。这可能没有为列表中的每个单词创建一个新的re.compile吗?

还是有另一种方法来实现同样的目标吗?

我希望将re.compile的数量保持最小的原因是速度,因为在我的应用程序中,我有多个单词列表和大约3500个要搜索的字符串。

4 个答案:

答案 0 :(得分:10)

如果您使用findall代替search,那么您会得到一个包含所有匹配单词的元组。

print exactMatch.findall("my blue cat")
print exactMatch.findall("my red car")
print exactMatch.findall("my red and blue monkey")
print exactMatch.findall("my yellow dog")

将导致

  

[ '蓝色']
  [ '红']
  ['red','blue']
  []

如果您需要使用len()

获取匹配数量
print len(exactMatch.findall("my blue cat"))
print len(exactMatch.findall("my red car"))
print len(exactMatch.findall("my red and blue monkey"))
print len(exactMatch.findall("my yellow dog"))

将导致

  

1
  1
  2
  0

答案 1 :(得分:3)

如果我对这个问题说得对,你只想知道一句话中蓝色或红色的匹配数量。

>>> exactMatch = re.compile(r'%s' % '|'.join(words), flags=re.IGNORECASE)
>>> print exactMatch.findall("my blue blue cat")
['blue', 'blue']
>>> print len(exactMatch.findall("my blue blue cat"))
2

如果要测试多种颜色,则需要更多代码

答案 2 :(得分:1)

为什么不将所有单词存储在哈希中并通过查找器迭代查找句子中的每个单词

  words = { "red": 1 .... }
  word = re.compile(r'\b(\w+)\b')
  for i in word.finditer(sentence): 
     if words.get(i.group(1)):
       ....

答案 3 :(得分:1)

for w in words:
    if w in searchterm:
        print "found"