您的代码有几个问题:
- 已经存在一个
islpha
函数;它是一种str
方法(参见下面的示例)。
- 你
trucatedInput
是 a str
,它是一个不可变的类型。您不能重新分配不可变类型的部分;即myStr[3]='x'
通常会失败。如果你真的想这样做,你最好将截断的输入表示为一个列表,并''.join(truncatedInput)
在以后将其转换为字符串。
- 您当前正在查看截断输入中的字符,以检查它们中的任何一个是否等于
'DRAT'
。这就是你的第一个 for 循环main
所做的。但是,您似乎想要的是迭代单词本身 - 为此您需要一个“分块器”。如果你想处理自由格式的英语,这是一个稍微困难的问题。例如,一个简单的单词分块器会简单地将您的句子拆分为空格。但是,当您有一个包含单词“DRAT'S”的句子时会发生什么?由于这种情况,您将被迫创建一个适当的分块器来根据需要处理标点符号。这是一个相当高级的设计决策。您可能想看看NLTK
它是否有任何分块器可以帮助您。
例子:
str.isalpha
In [3]: myStr = 'abc45d'
In [4]: for char in myStr:
...: print char, char.isalpha()
...:
a True
b True
c True
4 False
5 False
d True
字符串是不可变的
In [5]: myStr[3] = 'x'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-bf15aed01ea1> in <module>()
----> 1 myStr[3] = 'x'
TypeError: 'str' object does not support item assignment
str.replace
最后,正如其他人所建议的那样,无论如何使用可能会好得多。但是,请注意替换非审查词的子字符串。例如,单词“hello”中的子字符串“hell”不需要审查。为了适应此类文本,您可能需要使用re.sub
正则表达式替换,而不是str.replace
.
另外一点,python 允许传递比较。所以你可以缩短if( c >= 'A' and c <='Z' or c >= 'a' and c <='z' or c >= '0' and c <='9')
成if( 'Z' >= c >= 'A' or 'z' >= c >= 'a' or '9' >= c >= '0')
. 顺便说一句,这可以替换为if c.isalpha() or c.isdigit()
希望这可以帮助