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