1

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

例如,一个文档可能包含以下内容:

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]
4

3 回答 3

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 正则表达式表示任何单词分隔符,包括行尾/行首。

于 2012-09-01T00:09:58.850 回答
2

如果正则表达式(?<![a-zA-Z])risk(?![a-zA-Z])前面或后面没有另一个字母,则它应该匹配“风险”。例如:

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

这是这个re的细分:

  • (?<![a-zA-Z])这种否定的lookbehind断言表明,只有在匹配之前没有匹配for 时才会发生匹配[a-zA-Z],而for 又只匹配一个字母。
  • risk这是与“风险”相匹配的中心资源;这里没有什么特别的......
  • (?![a-zA-Z])这与第一部分类似。这是一个否定的先行断言,只有当它后面没有一个字母时才会发生匹配。

因此,假设您也不想匹配前面有数字的“1risk”之类的东西。您只需[a-zA-Z]将 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; 最直观的可能是只使用 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
于 2012-09-01T00:17:48.833 回答
0
if 'risk' == word:
    print word, word_dict[word]
于 2012-09-01T00:04:09.023 回答