Удалить цифры в Python (регулярное выражение)

StackOverflow https://stackoverflow.com/questions/817122

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь удалить все цифры из строки.Однако следующий код удаляет также цифры, содержащиеся в любом слове, и, очевидно, мне этого не нужно.Я пробовал много регулярных выражений, но безуспешно.

Спасибо!


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

Результат:

Это нельзя удалять, но число в конце да

Это было полезно?

Решение

Добавьте пробел перед \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 '

Редактировать:Посмотрев комментарии решил сформировать более полный ответ.Я думаю, что это объясняет все случаи.

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

Другие советы

Попробуй это:

"\b\d+\b"

Это будет соответствовать только тем цифрам, которые не являются частью другого слова.

С использованием \s не очень хорошо, так как не обрабатывает вкладки и т. д.Первый вариант лучшего решения:

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

Обратите внимание, что шаблон представляет собой необработанную строку, поскольку \b обычно это escape-пространство для строк, и вместо этого нам нужен специальный escape-граничный регулярный выражение.Немного более интересная версия:

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

Это пытается удалить начальные/конечные пробелы, когда в начале/конце строки есть цифры.Я говорю «пытается», потому что, если в конце есть несколько чисел, у вас все еще есть пробелы.

Для обработки строк цифр в начале строки:

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

Если ваш номер всегда находится в конце строк, попробуйте:re.sub("\d+$", "", s)

В противном случае вы можете попробовать re.sub ("( s) d+( s)", " 1 2", s)

Вы можете настроить обратные ссылки, чтобы сохранить только один или два пробела (\s соответствует любому белому разделителю).

Решение без регулярных выражений:

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

Разделяется на " ", и проверяет, является ли фрагмент числом, выполнив str().isdigit(), затем снова объединяет их вместе.Более подробно (без использования понимания списка):

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

" ".join(non_digits)

Я не знаю, как выглядит ваша реальная ситуация, но большинство ответов выглядят так, будто они не поддерживают отрицательные числа или десятичные дроби.

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

Вышеупомянутое также должно обрабатывать такие вещи, как:

"Это не b3 delete3d, а число в конце да -134.411"

Но это все еще неполно: вам, вероятно, нужно более полное определение того, что вы можете ожидать найти в файлах, которые вам нужно проанализировать.

Редактировать:Также стоит отметить, что '\b' меняется в зависимости от используемой вами локали/набора символов, поэтому вам нужно быть с этим немного осторожным.

Вы могли бы попробовать это

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

результат:

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

то же правило применимо и к

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

результат:

'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

"Это должно быть не b3 delete3d, а число в конце да"

Это удалит цифры в конце строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top