Удалить цифры в 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, но номер в конце да"
Это приведет к удалению числовых символов в конце строки.