Удалить цифры в 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» изменяется в зависимости от набора локалей / символов, который вы используете, поэтому вам нужно быть осторожным с этим.