0

我正在尝试从 python 中不需要的字符串中删除一些字符,但据我所知,replace 函数应该可以正常工作,但不是:(

顺便说一句(这只是一个简单的字数统计功能)

代码

fileName = "simple.txt"
inputFile = open(fileName, "rb")

wordCount = {}

for line in inputFile:
    splitted = line.split(" ")
    for word in splitted:
        word.replace('\n','') #It's not removing this chars from words
        word.replace('?','')  #Nor this ones

        if word in wordCount:
            wordCount[word] = wordCount[word] + 1
        else:
            wordCount[word] = 1

print wordCount

输入

一个人必须走多少路才能称他为男人?一只白鸽在沙中入睡之前必须航行多少海?是的,炮弹必须飞多少次才能被永远禁止?我朋友的答案随风飘扬 答案随风飘扬。

是的,一座山能存在多少年才会被冲入大海?是的,有些人在被允许自由之前可以存在多少年?是的,一个人可以多少次转头假装他只是没看到?我朋友的答案随风飘扬 答案随风飘扬。

是的,一个人必须仰望多少次才能真正看到天空?是的,一个人必须有多少只耳朵才能听到人们的哭声?是的,他要死多少人才能知道死了太多人?我朋友的答案随风飘扬 答案随风飘扬。

输出

{'ears': 1, 'Yes,': 7, 'allowed': 1, 'knows\n': 1, 'sleeps': 1, 'people': 3, 'seas': 1, 'is': 6, '\n': 2, 'some': 1, 'it': 1, 'walk': 1, 'How': 2, 'see': 1, "blowin'": 6, 'have': 1, 'in': 7, 'roads': 1, 'up\n': 1, 'free?\n': 1, 'cry?\n': 1, 'really': 1, 'one': 1,'山':1,'他':4,'just':1,'to':2,'it's':1,'deaths':1,'washed':1,'head\n': 1, 'how': 7, 'down\n': 1, 'call': 1, 'take': 1, 'Pretending': 1, 'answer': 6, 'have\n': 1, 'white ':1,'必须':5,'不':1,'朋友':3, 'can': 5, 'be': 1, 'sail\n': 1, 'his': 1, 'wind\n': 3, 'sea?\n': 1, 'cannon': 1 , 'till': 1, 'see?\n': 1, 'wind.\n': 3, 'man?\n': 1, 'you': 1, 'banned?\n': 1, ' hear': 1, 'too': 1, 'sky?\n': 1, 'The': 6, 'sand?\n': 1, 'dove': 1, 'him': 1, 'man' : 4, 'a': 6, "他们是": 2, 'forever': 1, 'balls': 1, 'look': 1, 'fly\n': 1, 'many': 10, '存在\n': 2, 'times': 3, 'will': 1, 'turn': 1, 'died?\n': 1, 'she': 1, 'the': 10, 'years': 2,“我的”:3,“那个”:1,“之前”:7}his': 1, '风\n': 3, '海?\n': 1, 'cannon': 1, 'till': 1, 'see?\n': 1, '风.\n': 3, 'man?\n': 1, 'you': 1, 'banned?\n': 1, 'hear': 1, 'too': 1, 'sky?\n': 1, 'The' : 6, 'sand?\n': 1, 'dove': 1, 'him': 1, 'man': 4, 'a': 6, "they're": 2, 'forever': 1, 'balls': 1, 'look': 1, 'fly\n': 1, 'many': 10, 'exist\n': 2, 'times': 3, 'will': 1, 'turn': 1, '死了?\n': 1, 'she': 1, 'the': 10, 'years': 2, 'my': 3, 'that': 1, 'Before': 7}his': 1, '风\n': 3, '海?\n': 1, 'cannon': 1, 'till': 1, 'see?\n': 1, '风.\n': 3, 'man?\n': 1, 'you': 1, 'banned?\n': 1, 'hear': 1, 'too': 1, 'sky?\n': 1, 'The' : 6, 'sand?\n': 1, 'dove': 1, 'him': 1, 'man': 4, 'a': 6, "they're": 2, 'forever': 1, 'balls': 1, 'look': 1, 'fly\n': 1, 'many': 10, 'exist\n': 2, 'times': 3, 'will': 1, 'turn': 1, '死了?\n': 1, 'she': 1, 'the': 10, 'years': 2, 'my': 3, 'that': 1, 'Before': 7}3, 'man?\n': 1, 'you': 1, 'banned?\n': 1, 'hear': 1, 'too': 1, 'sky?\n': 1, 'The' : 6, 'sand?\n': 1, 'dove': 1, 'him': 1, 'man': 4, 'a': 6, "they're": 2, 'forever': 1, 'balls': 1, 'look': 1, 'fly\n': 1, 'many': 10, 'exist\n': 2, 'times': 3, 'will': 1, 'turn': 1, '死了?\n': 1, 'she': 1, 'the': 10, 'years': 2, 'my': 3, 'that': 1, 'Before': 7}3, 'man?\n': 1, 'you': 1, 'banned?\n': 1, 'hear': 1, 'too': 1, 'sky?\n': 1, 'The' : 6, 'sand?\n': 1, 'dove': 1, 'him': 1, 'man': 4, 'a': 6, "they're": 2, 'forever': 1, 'balls': 1, 'look': 1, 'fly\n': 1, 'many': 10, 'exist\n': 2, 'times': 3, 'will': 1, 'turn': 1, '死了?\n': 1, 'she': 1, 'the': 10, 'years': 2, 'my': 3, 'that': 1, 'Before': 7}'forever': 1, 'balls': 1, 'look': 1, 'fly\n': 1, 'many': 10, 'exist\n': 2, 'times': 3, 'will': 1, '转': 1, '死了?\n': 1, 'she': 1, 'the': 10, 'years': 2, 'my': 3, 'that': 1, 'Before' : 7}'forever': 1, 'balls': 1, 'look': 1, 'fly\n': 1, 'many': 10, 'exist\n': 2, 'times': 3, 'will': 1, '转': 1, '死了?\n': 1, 'she': 1, 'the': 10, 'years': 2, 'my': 3, 'that': 1, 'Before' : 7}

谢谢!

4

4 回答 4

5

.replace() 返回更改后的字符串。存储该返回值:

word = word.replace('\n','') 

您可以链接替换调用:

word = word.replace('\n','').replace('?','')

字符串是不可变的,它们不能就地更改。

最后但并非最不重要的一点:用于collections.Counter()计数单词,它提供了许多额外的功能,使使用频率计数更容易:

from collections import Counter

with open(fileName, "rb") as inputFile:
    wordCount = Counter(w.replace('?', '')
        for line in inputFile for w in line.split())

wordCount它用一行创建你的结构。请注意,这.split()将有效地为您去除额外的空格和换行符。

请注意,如果您要从单词的开头或结尾删除标点符号,您应该真正使用该.strip()方法

wordCount = Counter(w.strip('.,:?')
    for line in inputFile for w in line.split())

其中.strip('.,:?')将删除参数中列出的开头或结尾处的所有字符。

于 2013-02-22T18:47:17.993 回答
1

string.replace不是就地操作,它返回一个值(新字符串)。因此,您需要这样做:

word = word.replace('\n', '')

还有一件事:

string.split()没有任何参数的情况下会自动拆分所有空格,因此如果您删除" ",您一开始就不必这样做.replace('\n', '')

于 2013-02-22T18:47:12.890 回答
1

python中的字符串是不可变的。这意味着您不会使用其方法修改字符串,而是使用诸如替换之类的方法返回新的字符串值,然后您必须将其存储在变量中。

更具体地说,这意味着给定一个字符串 s:

s = 'Some string'

然后

s.replace('string','hello')

简单地返回字符串'Some hello',但该值被简单地丢弃并且s仍然是'Some string'。要修改 s,您必须将返回的变量显式存储回 s 中,如下所示:

s = s.replace('string','hello')

现在 s 是“你好”。

于 2013-02-22T18:50:21.910 回答
0

如我所见,一种温和的方法是编写一个函数:

def remove_words (word, *to_replace):
for replace_word in to_replace:
    word = word.replace(replace_word, '')
return word
于 2013-02-24T18:03:23.020 回答