2011-11-20 27 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 '