Я пытаюсь удалить все цифры из строки. Однако следующий код удаляет также цифры, содержавшиеся в любом слове. Очевидно, я не хочу это. Я пробовал много регулярных выражений без успеха.
Спасибо!
s = "This must not be deleted, but the number at the end yes 134411"
s = re.sub("\d+", "", s)
print s
Результат:
Это не должно удаленный b, но число в конце да
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)
Решение без регулярного выражения:
>>> 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)
To handle digit strings at the beginning of a line as well:
s = re.sub(r"(^|\W)\d+", "", s)
Я не знаю, как выглядит ваша реальная ситуация, но большинство ответов выглядят так, как будто они не обрабатывают отрицательные числа или десятичные числа,
re.sub (r "(\ b | \ s + \ -? | ^ \ -?) (\ d + | \ d * \. \ d +) \ b "," ")
Вышесказанное также должно обрабатывать такие вещи, как,
" Это не должно b3 delet3d, но число в конце да -134.411 "
Но это все еще не полностью - вам, вероятно, нужно более полное определение того, что вы можете ожидать найти в файлах, которые нужно проанализировать.
Редактировать: это Также стоит отметить, что «\ b» меняется в зависимости от используемой локали / набора символов, поэтому вам нужно быть немного осторожнее с этим.
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)
Try this:
"\b\d+\b"
That'll match only those digits that are not part of another word.
Использование \ s
не очень хорошо, так как не обрабатывает вкладки, и др. Первое сокращение в лучшем решении:
re.sub(r"\b\d+\b", "", s)
Обратите внимание, что шаблон является необработанной строкой, потому что \ b
обычно является escape-символом возврата для строк, и вместо этого мы хотим использовать специальный экранирующий символ regex. Немного более причудливая версия:
re.sub(r"$\d+\W+|\b\d+\b|\W+\d+$", "", s)
, которая пытается удалить начальные / конечные пробелы, когда есть цифры в начале / конце строки. Я говорю «пытается», потому что если в конце есть несколько чисел, у вас все еще есть пробелы.