Удалить цифры в Python (регулярное выражение)
Вопрос
Я пытаюсь удалить все цифры из строки.Однако следующий код удаляет также цифры, содержащиеся в любом слове, и, очевидно, мне этого не нужно.Я пробовал много регулярных выражений, но безуспешно.
Спасибо!
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, а число в конце да"
Это удалит цифры в конце строки.