如何找到特定类型的单词并计算它

时间:2012-09-01 00:01:57

标签: python

我正在尝试识别某个特定单词,然后计算它。我需要保存每个标识符的计数。

例如,文档可能包含如下:

risk risk risk free interest rate 

asterisk risk risk 

market risk risk [risk

*我需要计算'风险'不是星号。可能存在其他与风险相关的单词,因此不要坚持上述示例。我需要找到的是“风险”。如果风险以<< [(或。!*>])等等。我也需要数数。但如果风险词是像星号这样的词的一个组成部分,那么我不应该算它。

这是我到目前为止所拥有的。但是,它会返回星号和[风险以及风险]的计数。我试图使用正则表达式,但不断收到错误。另外,我是Python的初学者。如果有人有任何想法,请帮助我!! ^^谢谢。

from collections import defaultdict
word_dict=defaultdict(int)

for line in mylist:
    words=line.lower().split()  # converted all words to lower case
    for word in words:
        word_dict[word]+=1

for word in word_dict:
    if 'risk' in word:
       word, word_dict[word]

3 个答案:

答案 0 :(得分:2)

使用正则表达式实际上很容易做到这一点:

import re
haystack = "risk asterisk risk brisk risk"
prog = re.compile(r'\brisk\b')
result = re.findall(prog, haystack)
print len(result)

输出“3”。

\ b regexp表示任何单词分隔符,包括行的结尾/开头。

答案 1 :(得分:2)

如果正则表达式(?<![a-zA-Z])risk(?![a-zA-Z])之前或之后没有其他字母,则该表达式应与“风险”相匹配。例如:

>>> len(re.findall('(?<![a-zA-Z])risk(?![a-zA-Z])','risk? 1risk asterisk risky'))
2

以下是此问题的细分:

  • (?<![a-zA-Z])这种负面的后瞻性断言表示,匹配只会在[a-zA-Z]之前没有匹配的情况下发生,而risk只匹配一个字母。
  • (?![a-zA-Z])这是与“风险”相匹配的核心人物;这里没什么好看的......
  • [a-zA-Z]这与第一部分类似。这是一个负前瞻性断言,只有在没有字母后才会发生匹配。

所以,说你也不想匹配像他们之前有数字的“1risk”之类的东西。您只需将re的[a-zA-Z0-9]部分更改为>>> len(re.findall('(?<![a-zA-Z0-9])risk(?![a-zA-Z0-9])','risk? 1risk asterisk risky')) 1 即可。例如:

|

更新的 在回答您的问题How to replace words, count a word, and save the count时,我现在得到了您的要求。您可以使用我向您展示的相同类型的结构,但已修改为包含所有这些单词:

  • 风险
  • 冒着
  • 风险更高的
  • 风险最高
  • 冒险地
  • 风险程度
  • 冒着
  • 风险
  • 风险

有几种方法可以修改原始版本;最直观的可能就是使用re OR \-并将>>> words = '|'.join(["risk","risked","riskier","riskiest","riskily","riskiness","risking","risks","risky"]) >>> len(re.findall('(?<![a-zA-Z])(%s)(?![a-zA-Z\-])' % words, 'risk? 1risk risky risk-free')) 3 添加到负向前瞻以防止匹配“无风险”等。例如:

{{1}}

答案 2 :(得分:0)

if 'risk' == word:
    print word, word_dict[word]