2011-11-20 10 views
17

En Python, quiero extraer solo los caracteres de una cadena.Extraer solo caracteres de una cadena en Python

Considere tengo la siguiente cadena,

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

Quiero el resultado como,

output = "players year money ipod case mini" 

Me trataron de dividir considerando sólo los alfabetos,

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

Pero la escisión no está sucediendo

+3

Split hace lo contrario de lo que estás tratando de hacer - elimina delimi ters, y ha especificado '[a-zA-Z] +' como delimitador, por lo que se elimina. – Nicole

+3

¿De dónde sacas este formato de datos tonto? –

+1

Aunque haya elegido la respuesta de chown, eche un vistazo a sbery2A a continuación. ¿De dónde sacas estos datos de entrada? Parece un diccionario de Python, excepto que se lo cita para convertirlo en una cadena. –

Respuesta

27

Se podía hacerlo con re, pero el método de cadena dividida no lo toma una expresión regular, se necesita una cadena.

Aquí está una manera de hacerlo con re:

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

Funciono bien, gracias =) – marcelosalloum

2

¿Qué tal hacer esto?

>>> 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

¿Por qué cambia el orden de las claves? ¿En qué se basa? (no es valor, no es alfabético ...)? – Nicole

+2

evaluando cadenas para analizarlas? caro e inseguro. –

+7

¿Inseguro? ¿Entiendes lo que hace 'ast.literal_eval()'? –

4

creo que desea que todas las palabras, no caracteres.

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

Explicación:

" 
\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

esta solución no acepta letras mayúsculas, ¿o sí? – juliomalegria

+2

@ julio.alegria ¿No ves el (? I) delante de la expresión regular? – FailedDev

+1

no sabía nada sobre '(?i) ', es por eso que pregunté :) – juliomalegria

5

string.split() no toma las expresiones regulares. ¿Quieres algo como:

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

y para obtener una cadena:

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

O si desea que todos los personajes, independientemente de las palabras o espacios vacíos

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

q impresión 'someString '

Cuestiones relacionadas