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 ifnot 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 listfor i in s:ifnot 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 ifnot i.isdigit())>>> result
'abcd'
@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.
@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'
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 notin l:
st_res+=ch
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 notin map(str,range(0,10))else""for c in stringWithNumbers)print(stringWithoutNumbers)#I have bananas for my monkeys!
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
re
:result = re.sub(r'[0-9]+', '', s)
"\d"
es lo mismo en una expresión regular que"[0-9]"
, por lo que puede hacerlo en suresult = re.sub(r"\d+", "", s)
lugar. La velocidad probablemente dependerá de la cadena en particular que se use, pero para mí,re.sub
tomó aproximadamente el doble de tiempostr.translate
(un poco más si no usa un patrón precompilado).Respuestas:
¿Funcionaría esto para su situación?
Esto hace uso de una lista de comprensión, y lo que está sucediendo aquí es similar a esta estructura:
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 :):
fuente
[]
Y, solo para agregarlo a la mezcla, es el que a menudo se olvida
str.translate
que funcionará mucho más rápido que las expresiones regulares / en bucle:Para Python 2:
Para Python 3:
fuente
'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
No estoy seguro de si tu profesor te permite usar filtros pero ...
devoluciones-
Mucho más eficiente que hacer bucles ...
Ejemplo:
fuente
¿Qué pasa con esto?
fuente
<filter object at 0x7f749e1745c0>
. Python3.6Solo algunos (otros han sugerido algunos de estos)
Método 1:
Método 2:
Método 3:
Método 4:
Método 5:
fuente
Di st es tu cadena sin formato, luego ejecuta
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
fuente
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ó:
fuente
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
fuente