使用Python和正则表达式计算文本中的标点符号

时间:2013-04-30 04:08:18

标签: python regex text-mining

我试图计算小说中标点符号出现的次数。例如,我想找到问号和句号的出现以及所有其他非字母数字字符。然后我想将它们插入到csv文件中。我不知道怎么做正则表达式因为我没有那么多的python经验。有人可以帮我吗?

texts=string.punctuation
counts=dict(Counter(w.lower() for w in re.findall(r"\w+", open(cwd+"/"+book).read())))
writer = csv.writer(open("author.csv", 'a'))
writer.writerow([counts.get(fieldname,0) for fieldname in texts])

4 个答案:

答案 0 :(得分:6)

In [1]: from string import punctuation

In [2]: from collections import Counter

In [3]: counts = Counter(open('novel.txt').read())

In [4]: punctuation_counts = {k:v for k, v in counts.iteritems() if k in punctuation}

答案 1 :(得分:3)

from string import punctuation
from collections import Counter

with open('novel.txt') as f: # closes the file for you which is important!
    c = Counter(c for line in f for c in line if c in punctuation)

这也避免了将整部小说一次性加载到内存中。

顺便说一句,这就是string.punctuation的样子:

>>> punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

您可能需要根据需要在此添加或减少符号。

同样Counter定义__missing__,只需return 0。因此,不要将其初始化为字典,然后调用.get(x, 0)。只需将其保留为计数器并像c[x]一样访问它,如果它不存在,则其计数为0.我不确定为什么每个人都有突然的冲动要求将所有Counter降级为dict只是因为您在打印时看到了可怕的Counter([...]),而实际上Counter也是字典,值得尊重。

writer.writerow([counts.get(c, 0) for c in punctuation])

如果你离开你的柜台,你可以这样做:

writer.writerow([counts[c] for c in punctuation])

这更容易。

答案 2 :(得分:0)

你所拥有的代码非常接近你在计算单词时所需要的代码。如果你试图计算单词,你必须做的唯一修改可能是将最后一行更改为:

writer.writerows(counts.items())

不幸的是,你不是想在这里算词。如果您正在寻找单个字符的计数,我将避免使用正则表达式并直接进入count。您的代码可能如下所示:

book_text = open(cwd+"/"+book).read()
counts = {}
for character in texts:
    counts[character] = book_text.count(character)
writer.writerows(counts.items())

正如您可能知道的那样,这会生成一个字符,其中字符为键,字符在文本中显示为值的次数。然后我们按照我们对计算单词的方式编写它。

答案 3 :(得分:0)

使用curses:

import curses.ascii
str1 = "real, and? or, and? what."
t = (c for c in str1 if curses.ascii.ispunct(c))
d = dict()
for p in t:
    d[p] = 1 if not p in d else d[p] + 1 for p in t