3

我正在尝试计算标点符号在小说中出现的次数。例如,我想找到问号和句点以及所有其他非字母数字字符的出现。然后我想将它们插入到 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

5 回答 5

7
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}
于 2013-04-30T04:17:42.160 回答
4
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定义了一个do 。因此,不要将其初始化为字典,然后调用. 只需将它作为一个计数器并像 一样访问它,如果它不存在,它的计数为 0。我不知道为什么每个人都突然有将所有s 降级为s 的冲动,只是因为你看到的可怕外观你打印一个,而事实上s 也是字典并且值得尊重。__missing__return 0.get(x, 0)c[x]CounterdictCounter([...])Counter

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

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

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

这要容易得多。

于 2013-04-30T06:39:31.280 回答
1
import re
def count_puncts(x):
  # sub. punct. with '' and returns the new string with the no. of replacements.
  new_str, count = re.subn(r'\W', '', x)
  return count
于 2021-11-14T18:53:00.393 回答
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())

正如您可能知道的那样,这会生成一个字典,其中字符作为键,字符在文本中出现的次数作为值。然后我们像计算单词一样写它。

于 2013-04-30T04:15:19.727 回答
0

使用诅咒:

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
于 2013-04-30T04:18:23.683 回答