Удалить цифры в Python (Regex) - PullRequest
16 голосов
/ 03 мая 2009

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

Спасибо!


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

Результат:

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

Ответы [ 9 ]

25 голосов
/ 03 мая 2009

Добавьте пробел перед \ 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)
13 голосов
/ 03 мая 2009

Попробуйте это:

"\b\d+\b"

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

5 голосов
/ 03 мая 2009

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

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

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

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

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

3 голосов
/ 03 мая 2009

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

s = re.sub(r"(^|\W)\d+", "", s)
2 голосов
/ 03 мая 2009

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

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

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

1 голос
/ 15 декабря 2018

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

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'
1 голос
/ 03 мая 2009

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

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

Вышесказанное также должно обрабатывать такие вещи, как,

"Это должно быть не b3 delet3d, а число в конце да -134.411"

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

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

1 голос
/ 03 мая 2009

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

>>> 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)
0 голосов
/ 20 ноября 2017
>>>s = "This must not b3 delet3d, but the number at the end yes 134411"
>>>s = re.sub(r"\d*$", "", s)
>>>s

"Это должно быть не b3 delet3d, а число в конце да"

Это удалит цифры в конце строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...