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

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

Спасибо!


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

Результат:

Это не должно удаленный b, но число в конце да

16
задан John Doe 4 September 2019 в 12:37
поделиться

7 ответов

Add a space before the \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 '

Edit: After looking at the comments, I decided to form a more complete answer. I think this accounts for all the cases.

s = re.sub("^\d+\s|\s\d+\s|\s\d+$", " ", s)
27
ответ дан 30 November 2019 в 15:26
поделиться

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

>>> 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)
1
ответ дан 30 November 2019 в 15:26
поделиться

To handle digit strings at the beginning of a line as well:

s = re.sub(r"(^|\W)\d+", "", s)
3
ответ дан 30 November 2019 в 15:26
поделиться

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

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

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

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

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

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

1
ответ дан 30 November 2019 в 15:26
поделиться

If your number is allways at the end of your strings try : re.sub("\d+$", "", s)

otherwise, you may try re.sub("(\s)\d+(\s)", "\1\2", s)

You can adjust the back-references to keep only one or two of the spaces (\s match any white separator)

2
ответ дан 30 November 2019 в 15:26
поделиться

Try this:

"\b\d+\b"

That'll match only those digits that are not part of another word.

14
ответ дан 30 November 2019 в 15:26
поделиться

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

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

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

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

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

6
ответ дан 30 November 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: