在python中计算文本文件中单词的出现次数

时间:2015-04-06 04:47:41

标签: python regex

假设我们不需要打扰大写或小写,所以我使用了re.IGNORECASE。

我使用正则表达式来解决这个问题。这就是我解决的问题:

total = 0
for line in alllines:
    count = 0
    count = len(re.findall(word, line, re.IGNORECASE))
    total += count

但我遇到了一个我想知道的新问题。如果我只想要完整的单词怎么办?例如,如果该行包含'helloworld',那么如果我的术语是'hello',则不应计算它。但我的方式将计算它。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

要匹配完整的单词,您需要使用单词边界。

count = len(re.findall(r'\b'+ word + r'\b', line, re.IGNORECASE))

但这会匹配hello中的foo:hello:bar。如果您不想要这种类型的匹配,那么您可以使用外观断言来匹配完整的完整单词。

count = len(re.findall(r'(?<!\S)'+ word + r'(?!\S)', line, re.IGNORECASE))

如果你想传递的word正则表达式包含specail chars,那么你需要在该单词上使用re.escape函数,然后才能在正则表达式中使用它。

count = len(re.findall(r'(?<!\S)'+ re.escape(word) + r'(?!\S)', line, re.IGNORECASE))

(?<!\S)称为负向lookbehind,它断言匹配不会以非空格字符开头。为什么我们在这里使用断言意味着它不匹配任何字符,但它断言匹配是否可能。 (?!\S)称为负向前瞻,它断言匹配不会跟随非空格字符。也就是说,除了非空格字符之外,任何事物都在匹配之后。