Eliminando números de la cadena [cerrado]

121

¿Cómo puedo eliminar dígitos de una cadena?

usuario1739954
fuente
19
Con re:result = re.sub(r'[0-9]+', '', s)
Wiktor Stribiżew
con expresiones regulares necesitará agregar \. también, como puede ser un número decimal, creo. like result = re.sub (r '[0-9 \.] +', '', s)
GurhanCagin
1
"\d"es lo mismo en una expresión regular que "[0-9]", por lo que puede hacerlo en su result = re.sub(r"\d+", "", s)lugar. La velocidad probablemente dependerá de la cadena en particular que se use, pero para mí, re.subtomó aproximadamente el doble de tiempo str.translate(un poco más si no usa un patrón precompilado).
Nathan

Respuestas:

185

¿Funcionaría esto para su situación?

>>> s = '12abcd405'
>>> result = ''.join([i for i in s if not i.isdigit()])
>>> result
'abcd'

Esto hace uso de una lista de comprensión, y lo que está sucediendo aquí es similar a esta estructura:

no_digits = []
# Iterate through the string, adding non-numbers to the no_digits list
for i in s:
    if not i.isdigit():
        no_digits.append(i)

# Now join all elements of the list with '', 
# which puts all of the characters together.
result = ''.join(no_digits)

Como señalan @AshwiniChaudhary y @KirkStrauser, en realidad no es necesario usar los corchetes en el one-liner, lo que hace que la pieza dentro del paréntesis sea una expresión generadora (más eficiente que una comprensión de lista). Incluso si esto no cumple con los requisitos de su tarea, es algo sobre lo que debería leer eventualmente :):

>>> s = '12abcd405'
>>> result = ''.join(i for i in s if not i.isdigit())
>>> result
'abcd'
CoheteBurro
fuente
@SeanJohnson ¡Impresionante! Estoy seguro de que aprendí eso de otra persona en este sitio, por lo que el ciclo está completo :)
RocketDonkey
@RocketDonkey sin necesidad de[]
Ashwini Chaudhary
3
En Python 2.7 y superior, no necesita los corchetes alrededor de la comprensión de la lista. Puede dejarlos fuera y se convierte en una expresión generadora.
Kirk Strauser
Corregido - gracias @ AshwiniChaudhary / @ KirkStrauser.
RocketDonkey
@RocketDonkey también agrega alguna explicación, supongo que solo ver el código no ayudará al OP.
Ashwini Chaudhary
98

Y, solo para agregarlo a la mezcla, es el que a menudo se olvida str.translateque funcionará mucho más rápido que las expresiones regulares / en bucle:

Para Python 2:

from string import digits

s = 'abc123def456ghi789zero0'
res = s.translate(None, digits)
# 'abcdefghizero'

Para Python 3:

from string import digits

s = 'abc123def456ghi789zero0'
remove_digits = str.maketrans('', '', digits)
res = s.translate(remove_digits)
# 'abcdefghizero'
Jon Clements
fuente
13
Este enfoque no funcionará en Python3. Haga en su lugar: 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
valignatev
3
La mejor solución para Python2.
Harsh Wardhan
No funciona para cadenas de caracteres Unicode
Harry M
20

No estoy seguro de si tu profesor te permite usar filtros pero ...

filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h")

devoluciones-

'aaasdffgh'

Mucho más eficiente que hacer bucles ...

Ejemplo:

for i in range(10):
  a.replace(str(i),'')
Alain Nisam
fuente
1
devuelve esto en su lugar: <objeto de filtro en 0x03475FD0>
lone_coder
5

¿Qué pasa con esto?

out_string = filter(lambda c: not c.isdigit(), in_string)
Pavel Paulau
fuente
4
La salida es <filter object at 0x7f749e1745c0>. Python3.6
TitanFighter
@TitanFighter Puede convertir el generador en un objeto de lista ajustando ese objeto devuelto del filtro a la lista (filtro (...))
ahlusar1989
5

Solo algunos (otros han sugerido algunos de estos)

Método 1:

''.join(i for i in myStr if not i.isdigit())

Método 2:

def removeDigits(s):
    answer = []
    for char in s:
        if not char.isdigit():
            answer.append(char)
    return ''.join(char)

Método 3:

''.join(filter(lambda x: not x.isdigit(), mystr))

Método 4:

nums = set(map(int, range(10)))
''.join(i for i in mystr if i not in nums)

Método 5:

''.join(i for i in mystr if ord(i) not in range(48, 58))
inspectorG4dget
fuente
2
Valdría la pena mostrar una comparación de eficiencia en estos.
nu everest
2

Di st es tu cadena sin formato, luego ejecuta

st_nodigits=''.join(i for i in st if i.isalpha())

como se ha mencionado más arriba. Pero supongo que necesita algo muy simple, así que digamos que s es su cadena y st_res es una cadena sin dígitos, entonces aquí está su código

l = ['0','1','2','3','4','5','6','7','8','9']
st_res=""
for ch in s:
 if ch not in l:
  st_res+=ch
iddqd
fuente
1

Me encantaría usar expresiones regulares para lograr esto, pero dado que solo puede usar listas, bucles, funciones, etc.

esto es lo que se me ocurrió:

stringWithNumbers="I have 10 bananas for my 5 monkeys!"
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!
Sean Johnson
fuente
1

Si entiendo bien su pregunta, una forma de hacerlo es dividir la cadena en caracteres y luego verificar cada carácter en esa cadena usando un bucle, ya sea una cadena o un número y luego, si la cadena, guárdela en una variable y luego una vez que el bucle está terminado, muéstralo al usuario

Baahubali
fuente
Un bucle for itera automáticamente a través de cada carácter de una cadena, por lo que no es necesario dividir la cadena en caracteres.
Ashwini Chaudhary