2011-12-03 175 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' 
相關問題