2014-02-14 112 views
2

我編寫了Python 3中的cesar削片器,我已經達到了必須擺脫削減器部分中的特殊字符的地步。我目前的解決方案確實可以工作,但不想要的字符通過:如何刪除Python中的每個非字母字符3

chain = "abcàéÉç" 
listOfChain = list(chain) 
    for element in listOfChain: 
     if element.isalpha(): 
      print(element) 

上面的代碼應該只打印abcàéÉç已經過去了。我只想要A-Za-z,沒有éèêëç等等......如何檢查這些字符是否在列表中?
到目前爲止isalpha()讓那些通過。任何其他方式來做到這一點?

回答

3

按照3.3的文檔:

str.isalpha() 返回true,如果字符串中的所有字符是字母,至少有一個字符,否則爲false。字母字符是在Unicode字符數據庫中定義爲「Letter」的那些字符,即具有一般類別屬性爲「Lm」,「Lt」,「Lu」,「Ll」或「Lo」之一的那些字符。請注意,這與Unicode標準中定義的「字母」屬性不同。

所以isalpha()包括所有外國重音字符以及你想要的acsii字母。

隔離這些可能是進口string.ascii_letters這是所有小寫和大寫ASCII字母的字符串,然後

>>> from string import ascii_letters 
>>> for element in chars: 
>>> if element in ascii_letters: 
>>>  print(element) 
+0

感謝你的答案是非常有益的,而且很容易understamd最簡單的方法 – GothSparkImvu

0

您可以使用re

>>> re.search("[^a-zA-z]", "abcdef") 
>>> re.search("[^a-zA-z]", "abcdef2") 
<_sre.SRE_Match object at 0x10ddb78b8> 
>>> re.search("[^a-zA-Z]", "abcàéÉç") 
<_sre.SRE_Match object at 0x10ddb7850> 

這就使你的if語句

if re.search("[^a-zA-Z]", element) == None: 
    print element 

注意:如果你想允許的數字,以及,你可以用​​甚至simpiler更換[^a-zA-Z][\W]

編輯:爲了簡單起見,你甚至可以做

chain = abcàéÉç 
listOfChain = list(chain) 
listOfChain = [l for l in listOfChain if re.search("[^a-zA-Z]", l) == None] 
print "\n".join(listOfChain) 
0

使用Python 3,你可以使用包含所有字母字符的列表清單string.ascii_letters

>>> import string 
>>> chain = 'abcàéÉç' 
>>> listOfChain = [x for x in chain if x in string.ascii_letters] 
>>> listOfChain 
['a', 'b', 'c'] 

相比@hkpeprah的正則表達式的解決方案,它的效率更高:

# Regex solution 
>>> timeit.timeit('[l for l in chain if re.search("[^a-zA-Z]", l) == None]', setup='chain="abcàéÉç"; import re', number=100000) 
6.374363899230957 
# string contains solution 
>>> timeit.timeit("[x for x in chain if x in string.ascii_letters]", setup="chain='abcàéÉç'; import string;", number=100000) 
0.24501395225524902 
相關問題