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

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

Спасибо!


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

Результат:

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

Ответ 1

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

Ответ 2

Попробуйте следующее:

"\b\d+\b"

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

"Это не должно b3 delete3d, но номер в конце да -134.411"

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

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

Ответ 8

Вы можете попробовать это

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'

Ответ 9

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

"Это не должно b3 delete3d, но номер в конце да"

Это приведет к удалению числовых символов в конце строки.