Удалить цифры в Python (Regex)

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

Благодаря!


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

Результат:

Это не должно быть b deleted, но номер в конце да

    Добавьте пробел перед \ 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-пространством для строк, и мы хотим вместо этого использовать специальное выражение регулярного выражения. Немного более благоприятная версия:

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

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

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

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

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

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

     s = re.sub(r"(^|\W)\d+", "", 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» изменяется в зависимости от набора локалей / символов, который вы используете, поэтому вам нужно быть осторожным с этим.