我正在写一个拼写检查程序,如何替换字符串中的ch?

时间:2010-05-23 23:08:51

标签: python string python-3.x

我做错了什么/我能做什么?

import sys
import string

def remove(file):
    punctuation = string.punctuation
    for ch in file:
        if len(ch) > 1:
            print('error - ch is larger than 1 --| {0} |--'.format(ch))
        if ch in punctuation:
            ch = ' '
            return ch
        else:
            return ch

ref = (open("ref.txt","r"))
test_file = (open("test.txt", "r"))

dictionary = ref.read().split()
file = test_file.read().lower()
file = remove(file)
print(file)

这是在Python 3.1.2

3 个答案:

答案 0 :(得分:2)

在此代码中......:

for ch in file:
        if len(ch) > 1:

奇怪命名的file(除了打破不用自己的标识隐藏内置名称的最佳做法)不是文件,它是一个字符串 - 这意味着在Python 3中使用unicode,但这不是与循环返回单个字符(Python 3中的unicode字符,而不是字节)这一事实不同,因此len(ch) == 1完全由Python语言规则保证。不确定你试图通过该测试完成什么(排除unicode字符的某些子集?),但是,无论你实现了什么,我向你保证你不是实现它并且应该重新编写那部分。

除此之外,你将立即返回 - 并因此退出函数 - 从而退出函数并返回一个字符(文件中的第一个字符,如果第一个字符是标点符号则返回空格)字符)。

我在另一个答案中看到的使用translate方法的建议是正确的,但该答案使用了错误版本的translate(一个应用于字节字符串,不需要来解码你需要的Python 3)。正确的unicode版本更简单,并将函数的整个主体转换为两个语句:

trans = dict.fromkeys(map(ord, string.punctuation), ' ')
return file.translate(trans)

答案 1 :(得分:1)

在python中,字符串是不可变的,因此您需要使用您的更改创建一个新字符串。

有几种方法可以做到这一点:

一个是使用列表推导来检查字符,只返回非标点符号。

def remove(file):
  return ''.join(ch for ch in file if ch not in string.punctuation)

您还可以调用函数来测试角色或翻译您可能抛出“奇怪角色”异常的角色或执行其他功能:

def remove(file):
  return ''.join(TranslateCh(ch) for ch in file if CheckCh(ch))

另一个替代方案是string模块,提供replacetranslate。翻译为此提供了一个很好的(并且比构建列表更有效)机制,请参阅Alex的答案。

或者......你可以在for循环上收集一个列表并在最后加入它,但这有点“unpythonic”。

答案 2 :(得分:0)

查看re(正则表达式)模块。它有一个“sub”函数来替换与正则表达式匹配的字符串。