com regex, você precisará adicionar \. também, como pode ser um número decimal, eu acho. como resultado = re.sub (r '[0-9 \.] +', '', s)
GurhanCagin
1
"\d"é o mesmo que em uma regex "[0-9]", então você pode fazer result = re.sub(r"\d+", "", s). A velocidade provavelmente dependerá da string em particular sendo usada, mas para mim, re.subdemorou cerca do dobro do tempo str.translate(um pouco mais se você não usar um padrão pré-compilado).
Nathan
Respostas:
185
Isso funcionaria para a sua situação?
>>> s ='12abcd405'>>> result =''.join([i for i in s ifnot i.isdigit()])>>> result
'abcd'
Isso faz uso de uma compreensão de lista, e o que está acontecendo aqui é semelhante a esta estrutura:
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 @AshwiniChaudhary e @KirkStrauser apontam, você realmente não precisa usar os colchetes no one-liner, tornando a parte entre parênteses uma expressão geradora (mais eficiente do que uma compreensão de lista). Mesmo que isso não atenda aos requisitos da sua tarefa, é algo que você deve ler eventualmente :):
>>> s ='12abcd405'>>> result =''.join(i for i in s ifnot i.isdigit())>>> result
'abcd'
@SeanJohnson Awesome! Tenho certeza que aprendi isso com outra pessoa neste site, então o ciclo está completo :)
RocketDonkey
@RocketDonkey não precisa[]
Ashwini Chaudhary
3
No Python 2.7 e superior, você não precisa dos colchetes ao redor da compreensão da lista. Você pode deixá-los de fora e isso se torna uma expressão geradora.
Valeria a pena mostrar uma comparação de eficiência nestes.
nu everest
2
Diga st é a sua string não formatada e, em seguida, execute
st_nodigits=''.join(i for i in st if i.isalpha())
como acima mencionado. Mas acho que você precisa de algo muito simples, então digamos que s é sua string e st_res é uma string sem dígitos, então aqui está seu 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
Adoraria usar regex para fazer isso, mas uma vez que você só pode usar listas, loops, funções, etc.
aqui está o que eu inventei:
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!
Se eu entendi sua pergunta direito, uma maneira de fazer é quebrar a string em caracteres e, em seguida, verificar cada caractere nessa string usando um loop, se é uma string ou um número e, em seguida, se a string salvá-la em uma variável e depois no loop estiver concluído, exiba isso para o usuário
re
:result = re.sub(r'[0-9]+', '', s)
"\d"
é o mesmo que em uma regex"[0-9]"
, então você pode fazerresult = re.sub(r"\d+", "", s)
. A velocidade provavelmente dependerá da string em particular sendo usada, mas para mim,re.sub
demorou cerca do dobro do tempostr.translate
(um pouco mais se você não usar um padrão pré-compilado).Respostas:
Isso funcionaria para a sua situação?
Isso faz uso de uma compreensão de lista, e o que está acontecendo aqui é semelhante a esta estrutura:
Como @AshwiniChaudhary e @KirkStrauser apontam, você realmente não precisa usar os colchetes no one-liner, tornando a parte entre parênteses uma expressão geradora (mais eficiente do que uma compreensão de lista). Mesmo que isso não atenda aos requisitos da sua tarefa, é algo que você deve ler eventualmente :):
fonte
[]
E, apenas para jogar na mistura, é o frequentemente esquecido
str.translate
que funcionará muito mais rápido do que expressões regulares / looping:Para Python 2:
Para Python 3:
fonte
'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
Não tenho certeza se seu professor permite que você use filtros, mas ...
retorna-
Muito mais eficiente do que looping ...
Exemplo:
fonte
Que tal isso:
fonte
<filter object at 0x7f749e1745c0>
. Python3.6Apenas alguns (outros sugeriram alguns deles)
Método 1:
Método 2:
Método 3:
Método 4:
Método 5:
fonte
Diga st é a sua string não formatada e, em seguida, execute
como acima mencionado. Mas acho que você precisa de algo muito simples, então digamos que s é sua string e st_res é uma string sem dígitos, então aqui está seu código
fonte
Adoraria usar regex para fazer isso, mas uma vez que você só pode usar listas, loops, funções, etc.
aqui está o que eu inventei:
fonte
Se eu entendi sua pergunta direito, uma maneira de fazer é quebrar a string em caracteres e, em seguida, verificar cada caractere nessa string usando um loop, se é uma string ou um número e, em seguida, se a string salvá-la em uma variável e depois no loop estiver concluído, exiba isso para o usuário
fonte