2011-12-03 302 views
0

这是我学习python的第二周,我得到了一份我已经完成的作业作业。 事情是,第一个阶段之一是采取一个字符串,并从它删除所有非字母(如“,”“”“”,空​​格等..) 所以我把字符串和每次写道:字符串与非字母

str1 = str.replace(',', '') 
str2 = str.replace(' ', '') 
.... 

等5次。我的老师说现在很好。但它对我来说并不好看。 必须有更好的方式而不是重复代码。 有人可以解释一个更好的方式吗?

(我因子评分有关的条件使用ASCII功能,但无法弄清楚)

回答

1

它更容易找到letters比非字母:

import string 

def clean_string(input_string): 
    result = "" 
    for char in input_string: 
     if char in string.letters: # string.letters contains a...zA...Z 
      result += char 
    return result 

也有这样的发烧友方式:

def clean_string2(input_string): 
    return "".join([char for char in input_string if char in string.letters]) 
+0

好的解决方案,但是使用列表理解,它会更好。 ;-) – Achim

+0

@Achim - 查看编辑。尽管如此,我认为第一个对于初学者来说更具可读性。 –

2

您可以使用re module这样的:

import re 
str = re.sub(r'[^a-zA-Z]+', '', str) 
+1

或者,只是'\ W' – carl

+1

@carl:那就不是删除位数。 – icktoofay

+0

@carl'\ W'相当于'[^ a-zA-Z0-9_]' – Marlon

1

当然!你可以使用循环:

toBeReplaced = [',',' ', ... some more chars ...] 
for c in toBeReplaced: 
    yourString = yourString.replace(c,'') 

你也许看看正则表达式,这会使你的工作更简单,更稳定。但这可能不是你的老师想要看到的。

1

我不会给你任何代码,因为这是一个家庭作业,如果你自己编码,它会对你更好。但我会试着给你一些提示,让你朝正确的方向发展。

作为一项家庭作业,您的老师希望您编写可扩展和可管理的代码。当你复制代码时,它会失去这两个属性。

对于这项任务,您想要做的第一件事是仔细查看要求。有太多的非字母字符,所以不要删除它们中的每一个,只能考虑,包括的字母字符。这可以使用for循环完成。

一旦你学习了更高级的技术,你就可以开始研究正则表达式模式,并使用它们。在Python中,这些可以在re模块中找到。用了正则表达式和无进口

0

一行:

''.join([ x for x in str if x.isalpha() ]) 

样本:

>>> ''.join([ x for x in 'pepito;.:123jdjd' if x.isalpha() ]) 
'pepitojdjd' 
+0

注意:附加'或x.str。isdigit()'为了取数字。 – danihp

0
>>> s = 'pepito;.:123jdjd' 
>>> import string 
>>> s.translate(string.maketrans('',''), string.punctuation) 
'pepito123jdjd' 
相关问题