2013-07-06 301 views
1

我正在連續輸入用戶輸入的字符串,然後嘗試刪除任何不是字符或數字的字符。將列表轉換爲字符串

我開發的方法涉及到用空格分割字符串,然後分析每個單詞以查找無效字符。

我很難把單詞與每個單詞之間的空格放在一起。我試過使用''.join(list),但它在每個字符或數字之間放置一個空格。

+0

而不是'''.join(string)'你可以簡單地完成'''.join(string)'。 (但是你的具體問題可以更容易解決) – Kos

+0

這段代碼不起作用。第一次在它之後沒有任何縮進 –

+0

我複製並粘貼了我的代碼,但我不得不使用4個空格縮進。我的一些標籤沒有顯示出來。 –

回答

4

當然,@阿什維尼的答案是比這更好的,但如果你仍然想只是循環做

strings = raw_input("type something") 
while(True): 
    MyString = "" 
    if strings == "stop": break 
    for string in strings.split(): 
     for char in string: 
      if(char.isalnum()): MyString += char 
     MyString += " " 
    print MyString 
    strings = raw_input("continue : ") 

樣品運行

$ python Test.py 
type somethingWelcome to$%^ Python 
Welcome to Python 
continue : I love numbers 1234 but not [email protected]#$ 
I love numbers 1234 but not 
continue : stop 

EDIT

的Python 3版本:

作爲評價表明通過阿什維尼,在列表存儲字符和打印列表的,並在最後加入。

strings = input("type something : ") 
while(True): 
    MyString = [] 
    if strings == "stop": break 
    for string in strings.split(): 
     for char in string: 
      if(char.isalnum()): MyString.append(char) 
     MyString.append(" ") 
    print (''.join(MyString)) 
    strings = input("continue : ") 

樣品試驗:

$ python3 Test.py 
type something : abcd 
abcd 
continue : I love Python 123 
I love Python 123 
continue : I hate [email protected]# 
I hate 
continue : stop 
+0

我運行了你的代碼並得到了不同的輸出。是因爲我使用python 3嗎? –

+0

請注意,使用'+'或'+ ='完成的字符串連接相當[效率低下](http://wiki.python.org/moin/PythonSpeed/PerformanceTips#String_Concatenation),將字符附加到列表並使用最後加入。 –

+0

@HarryHarry用'input'替換'raw_input'並在py3.x中使用'print'作爲函數 –

2
基於

簡單的循環解決方案:

strs = "foo12 #$dsfs 8d" 
ans = [] 
for c in strs: 
    if c.isalnum(): 
     ans.append(c) 
    elif c.isspace(): #handles all types of white-space characters \n \t etc. 
     ans.append(c) 
print ("".join(ans)) 
#foo12 dsfs 8d 

一行程序:

使用str.translate

>>> from string import punctuation, whitespace 
>>> "foo12 #$dsfs 8d".translate(None,punctuation) 
'foo12 dsfs 8d' 

要刪除的空白,以及:

>>> "foo12 #$dsfs 8d".translate(None,punctuation+whitespace) 
'foo12dsfs8d' 

regex

>>> import re 
>>> strs = "foo12 #$dsfs 8d" 
>>> re.sub(r'[^0-9a-zA-Z]','',strs) 
'foo12dsfs8d' 

使用str.joinstr.isalnumstr.isspace

>>> strs = "foo12 #$dsfs 8d" 
>>> "".join([c for c in strs if c.isalnum() or c.isspace()]) 
'foo12 dsfs 8d' 
+1

我不認爲我可以使用翻譯。是否有可能以另一種方式做到這一點? –

+1

@HarryHarry'str.translate'有什麼問題? –

+0

這是我的教授的一個規則。如果我們沒有在課堂上介紹它,那麼它就不能使用。 –

0

這是我的解決方案。看評論的更多信息:

def sanitize(word): 
    """use this to clean words""" 
    return ''.join([x for x in word if x.isalpha()]) 

n = input("type something") 

#simpler way of detecting stop 
while(n[-4:] != 'stop'): 
    n += " " + input("continue : ") 

n = n.split()[:-1] 
# if yuo use list= you are redefining the standard list object 
my_list = [sanitize(word) for word in n] 

print(my_list) 
strn = ' '.join(my_list) 
print(strn) 
0

你可以做到這一點,並加入列表理解。

def goodChars(s): 
    return " ".join(["".join([y for y in x if y.isdigit() or y.isalpha()]) for x in s.split()])