【问题标题】:replace letters using string.punctuation in a for loop在 for 循环中使用 string.punctuation 替换字母
【发布时间】:2013-05-27 07:22:46
【问题描述】:

简而言之,我试图用空格替换行内单词中的任何标点符号。

例如,一旦处理,文本文档输出将没有这样的标点符号。

喵喵喵!我说我taw了一个腻子tat。我做了我做了我做了一个腻子 tat Shsssssssssh 我在打猎兔兔 嘿嘿嘿嘿嘿嘿嘿 好日子去猎兔兔 嘿嘿嘿 停止它的兔兔 Huntin Season Huntin Wabbits 终极指南 101 种方法 野兔

如果没有改变,它看起来像这样。

来自 question5.txt 的文本

喵喵喵!我说我taw了一个腻子tat。我做到了!我做到了!我确实撕了一个腻子 达。 Shsssssssssh ...我在打猎鹬。嘿嘿嘿嘿……这是一个 美好的一天去猎兔! ... 嘿嘿嘿... 停止 - 这是 wabbit 狩猎季节! Huntin Wabbits:最终指南 101 种方法 wabbit。

这是一个练习,所以我被告知使用 .replace 和 for 循环。

import string
infile = open('question5.txt', 'r')

lines = infile.readlines()
lines = str(lines)
for words in lines:
    for letters in words:
        letters.replace(string.punctuation,' ')
        print(letters)

我们将不胜感激任何解决问题的帮助。

请注意,在您的建议和一些研究之后,如果有人关注结果,我会在更多小时后结束。谢谢大家Waves

import string
infile = open('question5.txt', 'r')
lines = infile.readlines()

def word_count(list):
    count = 0
    list = str(list)
    for lines in list:
        list = list.replace('.',' ')
        list = list.replace(',',' ')
        list = list.replace('-',' ')

    split = list.split()
    print (split)
    for words in split:
        count = count + 1
    return count


for line in lines:
    count = word_count(line)
    print(count)
infile.close()

【问题讨论】:

  • 对不起,我会添加一些细节
  • 阅读“替换”文档
  • 我想知道为什么老师们会对如何制作家庭作业施加这些人为限制。我的意思是,编程就是选择正确的工具,如果人们被告知要使用错误的工具,他们会学到什么?
  • @thg435:这只是为了训练大脑。它使学生​​了解幕后发生的事情。示例中的问题已多次解决。目标不是为别人解决问题。目标是了解解决问题的方法。

标签: python python-2.7 python-3.x


【解决方案1】:

这样更好:

import string as st

trans = st.maketrans(st.punctuation, ' '*len(st.punctuation))
with open('question5.txt', 'r') as f:
    for line in f:
        print line.translate(trans)

【讨论】:

  • 我选择这个是因为它最接近我能理解的,如果我不理解它,我不会使用代码,因为它不是我的代码:D,再次感谢
【解决方案2】:

我不能 100% 确定,因为您的示例输出仍然包含一些标点符号 - 可能是拼写错误?

在 Python 2.x 中,您可以尝试以下操作,因为它实际上并没有显示您正在用空格替换,而不仅仅是删除标点符号。

from string import punctuation
with open('question5.txt') as fin:
    test = fin.read()

new_text = test.translate(None, punctuation)

或者,使用正则表达式:

import re
new_text = re.sub('[' + re.escape(punctuation) + ']+', '', test)

仅使用循环的示例:

new_string = ''
for ch in old_string:
    if ch not in punctuation:
        new_string += ch

通过将punctuation 放入一个集合(或使用上述方法)可以提高效率

【讨论】:

  • 嘿乔恩,是的,我的问题是我没有得到预期的结果,因此我在这里
  • @bennyboy 好吧,你发现上面的方法给你的结果根本没有标点符号
【解决方案3】:

首先,作为 elyase shows,您应该使用 with 构造,或者您应该在最后关闭文件。此外,正如他所展示的,在读取文本文件并动态处理它时,您永远不应该使用.readlines()。只需循环遍历文件对象的内容。逐行迭代(包括结尾\n)。

另一个问题是lines = str(lines)。实际上,您的 lines 最初是一个字符串列表。 str 将其转换为类似于"['Meep...', 'wabits...', 'huntin...']" 的单个字符串。您首先遍历该字符串——获取单个字符(作为单字符字符串)。将其命名为words 并不会改变现实。 (如果你真的想把这些词去掉,你应该使用for word in line.split():之类的东西。)

然后您将通过单个字符进行第二次循环 - 再次获取单个字符(即循环仅转一次并且不添加任何功能)。

接下来,.replace() 返回替换结果,但它不修改参数。您希望将结果分配给某个变量。无论如何,您不能将string.punctuation 用作要替换的旧字符串,因为它永远不会在源文本中找到。蛮力解决方案必须遍历标点字符的字符串并替换单个字符。

总而言之,letters 仍然包含单个字符——没有替换。然后打印单个字符。 print 函数添加换行符。这样,您可以看到原始内容呈现为以中文方式编写的字符串/行列表的字符串表示形式——单列顶部/向下。

最后,the string.punctuation 只是一个字符串常量。

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

您可以通过不导入 string 模块(如果您没有被告知这样做)来简化您的代码,并使用您自己的字符串文字和应该被视为标点字符的字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2018-08-20
    相关资源
    最近更新 更多