2011-11-20 28 views
17

在Python中,我只想提取字符串中的字符。從Python中的字符串中提取字符

考慮我有以下字符串,

input = "{('players',): 24, ('year',): 28, ('money',): 19, ('ipod',): 36, ('case',): 23, ('mini',): 46}" 

我想要的結果是,

output = "players year money ipod case mini" 

我試圖拆只考慮字母,

word1 = st.split("[a-zA-Z]+") 

但分裂沒有發生。

+3

斯普利特做你想做的事情的相反 - 它消除了delimi ters,並且你指定'[a-zA-Z] +'作爲分隔符,所以它被刪除。 – Nicole

+3

你從哪裏得到這個愚蠢的數據格式? –

+1

雖然你已經選擇了chown的答案,請看下面的sbery2A。你從哪裏得到這個輸入數據。它看起來像一個Python字典,只是引用它來使它成爲一個字符串。 –

回答

27

您可以用重新做,但字符串分割法犯規拿一個正則表達式,它需要一個字符串。

繼承人的一種方式與重新做到這一點:

import re 
word1 = " ".join(re.findall("[a-zA-Z]+", st)) 
+0

我perfetcly工作,謝謝=) – marcelosalloum

2

怎麼樣?

>>> import ast 
>>> " ".join([k[0] for k in ast.literal_eval("{('players',): 24, ('year',): 28, ('money',): 19, ('ipod',): 36, ('case',): 23, ('mini',): 46}").keys()]) 
'case mini year money ipod players' 
+1

它爲什麼改變鍵的順序?它基於什麼? (不是價值,不是按字母順序......)? – Nicole

+2

評估字符串來解析它們?昂貴和不安全。 –

+7

不安全?你明白'ast.literal_eval()'的作用嗎? –

4

我認爲,你希望所有的話,而不是字符。

result = re.findall(r"(?i)\b[a-z]+\b", subject) 

說明:

" 
\b  # Assert position at a word boundary 
[a-z] # Match a single character in the range between 「a」 and 「z」 
    +  # Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
\b  # Assert position at a word boundary 
" 
+0

此解決方案不接受大寫字母,是嗎? – juliomalegria

+2

@ julio.alegria你沒看到正則表達式前面的(?i)嗎? – FailedDev

+1

對'(?我)',這就是爲什麼我問:) – juliomalegria

5

string.split()不帶正則表達式。 你想要的東西,如:

re.split("[^a-zA-Z]*", "your string") 

,並得到一個字符串:

" ".join(re.split("[^a-zA-Z]*", "your string")) 
1

或者,如果你希望所有的字符,無論文字或空的空間

a = "Some57 996S/tr::--!!ing" 
    q = "" 
    for i in a: 
     if i.isalpha(): 
      q = "".join([q,i]) 

打印q 「的SomeString '