Removendo números da string [fechado]


120

Como posso remover dígitos de uma string?


19
Com re:result = re.sub(r'[0-9]+', '', s)
Wiktor Stribiżew

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 if not 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 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 @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 if not 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.
Kirk Strauser

Corrigido - obrigado @ AshwiniChaudhary / @ KirkStrauser.
RocketDonkey

@RocketDonkey adiciona algumas explicações também, apenas ver o código não vai ajudar o OP, eu acho.
Ashwini Chaudhary

97

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:

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'

13
Essa abordagem não funcionará no Python3. Em vez disso, faça: 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
valignatev

3
Melhor solução para Python2.
Harsh Wardhan de

Não funciona para strings de caracteres Unicode
Harry M

20

Não tenho certeza se seu professor permite que você use filtros, mas ...

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

retorna-

'aaasdffgh'

Muito mais eficiente do que looping ...

Exemplo:

for i in range(10):
  a.replace(str(i),'')

1
ele retorna o seguinte: <objeto de filtro em 0x03475FD0>
lone_coder

5

Que tal isso:

out_string = filter(lambda c: not c.isdigit(), in_string)

4
A saída é <filter object at 0x7f749e1745c0>. Python3.6
TitanFighter

@TitanFighter Você pode coagir o gerador em um objeto de lista, envolvendo aquele objeto retornado do filtro na lista (filtro (...))
ahlusar1989

5

Apenas alguns (outros sugeriram alguns deles)

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

2
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 not in l:
  st_res+=ch

1

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 not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!

1

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


Um loop for itera automaticamente através de cada caractere de uma string, portanto, não há necessidade de quebrar a string em caracteres.
Ashwini Chaudhary
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.