Pergunta

Eu estou tentando excluir todos os dígitos de uma string. No entanto os próximos exclusões de código como dígitos bem contido em qualquer palavra, e, obviamente, eu não quero isso. Eu tenho tentado muitas expressões regulares sem sucesso.

Obrigado!


s = "This must not b3 delet3d, but the number at the end yes 134411"
s = re.sub("\d+", "", s)
print s

Resultado:

Esta obrigação não b deletd, mas o número no sim end

Foi útil?

Solução

Adicionar um espaço antes do \ d +.

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> s = re.sub(" \d+", " ", s)
>>> s
'This must not b3 delet3d, but the number at the end yes '

Edit: Depois de olhar para os comentários, eu decidi formar uma resposta mais completa. Eu acho que esta representa para todos os casos.

s = re.sub("^\d+\s|\s\d+\s|\s\d+$", " ", s)

Outras dicas

Tente isto:

"\b\d+\b"

Isso vai corresponder apenas os dígitos que não fazem parte de outra palavra.

Usando \s não é muito boa, uma vez que não lidar com guias, et al. Um primeiro corte em uma solução melhor é:

re.sub(r"\b\d+\b", "", s)

Note que o padrão é uma string bruta porque \b é normalmente a fuga de retrocesso para cordas, e queremos que a palavra especial regex fronteira fuga vez. Uma versão ligeiramente mais sofisticado é:

re.sub(r"$\d+\W+|\b\d+\b|\W+\d+$", "", s)

que tenta remover líder / espaços em branco quando há dígitos no início / fim da cadeia. Eu digo "tenta" porque se houver vários números no final, então você ainda tem alguns espaços.

Para lidar com seqüências de dígitos no início de uma linha assim:

s = re.sub(r"(^|\W)\d+", "", s)

Se o seu número é allways no final de suas cordas tentar: re.sub ( "\ d + $", "", s)

Caso contrário, você pode tentar re.sub ( "(\ s) \ d + (\ s)", "\ 1 \ 2", S)

Você pode ajustar as referências de volta para manter apenas um ou dois dos espaços (\ s corresponde a qualquer separador de branco)

solução não-regex:

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> " ".join([x for x in s.split(" ") if not x.isdigit()])
'This must not b3 delet3d, but the number at the end yes'

Splits por " ", e verifica se o pedaço é um número fazendo str().isdigit() , em seguida, junta-los juntos novamente. Mais verbosely (não usar uma compreensão da lista):

words = s.split(" ")
non_digits = []
for word in words:
    if not word.isdigit():
        non_digits.append(word)

" ".join(non_digits)

Eu não sei o que a sua aparência real situação gosto, mas a maioria das respostas parecem que não vai lidar com números negativos ou decimais,

re.sub(r"(\b|\s+\-?|^\-?)(\d+|\d*\.\d+)\b","")

O acima também devem lidar com coisas como:

"Esta obrigação não delet3d b3, mas o número no sim finais -134,411"

Mas isso ainda é incompleta -. Você provavelmente precisará de uma definição mais completa do que você pode esperar encontrar nos arquivos que você precisa para analisar

Edit:., Também é importante notar que '\ b' muda dependendo da localidade / conjunto de caracteres que você está usando para que você precisa ser um pouco cuidadoso com isso

Você poderia tentar este

s = "This must not b3 delet3d, but the number at the end yes 134411"
re.sub("(\s\d+)","",s) 

resultado:

'This must not b3 delet3d, but the number at the end yes'

a mesma regra também se aplica a

s = "This must not b3 delet3d, 4566 but the number at the end yes 134411" 
re.sub("(\s\d+)","",s) 

resultado:

'This must not b3 delet3d, but the number at the end yes'
>>>s = "This must not b3 delet3d, but the number at the end yes 134411"
>>>s = re.sub(r"\d*$", "", s)
>>>s

"Esta obrigação não delet3d b3, mas o número no sim end"

Isto irá remover os numericals no final da cadeia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top