Как удалить все нечисловые символы из строки в Python?
Удаление всех нечисловых символов из строки в Python
Ответ 1
>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'
Ответ 2
Не уверен, что это наиболее эффективный способ, но:
>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'
Часть ''.join
означает объединение всех результирующих символов вместе без каких-либо символов между ними. Тогда остальная часть - это понимание списка, где (как вы, наверное, догадываетесь), мы принимаем только части строки, которые соответствуют условию isdigit
.
Ответ 3
Это должно работать для строк и объектов Unicode:
# python <3.0
def only_numerics(seq):
return filter(type(seq).isdigit, seq)
# python ≥3.0
def only_numerics(seq):
seq_type= type(seq)
return seq_type().join(filter(seq_type.isdigit, seq))
Ответ 4
Самый быстрый подход, если вам нужно выполнить не одну или две такие операции удаления (или даже одну, но очень длинную строку!), - это полагаться на метод строк translate
, хотя ему нужна подготовка:
>>> import string
>>> allchars = ''.join(chr(i) for i in xrange(256))
>>> identity = string.maketrans('', '')
>>> nondigits = allchars.translate(identity, string.digits)
>>> s = 'abc123def456'
>>> s.translate(identity, nondigits)
'123456'
Метод translate
отличается и может быть проще простого в использовании в строках Unicode, чем в байтовых строках, btw:
>>> unondig = dict.fromkeys(xrange(65536))
>>> for x in string.digits: del unondig[ord(x)]
...
>>> s = u'abc123def456'
>>> s.translate(unondig)
u'123456'
Возможно, вы захотите использовать класс сопоставления, а не фактический dict, особенно если ваша строка Unicode может содержать символы с очень большими значениями ord (что сделает чрезмерное значение dict;-). Например:
>>> class keeponly(object):
... def __init__(self, keep):
... self.keep = set(ord(c) for c in keep)
... def __getitem__(self, key):
... if key in self.keep:
... return key
... return None
...
>>> s.translate(keeponly(string.digits))
u'123456'
>>>
Ответ 5
Чтобы добавить еще один параметр в микс, в модуле string
есть несколько полезных констант. Хотя они более полезны в других случаях, их можно использовать здесь.
>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
В модуле имеется несколько констант, включая:
-
ascii_letters
(аббревиатура) -
hexdigits
(0123456789abcdefABCDEF)
Если вы используете эти константы сильно, может быть полезно скрыть их до frozenset
. Это позволяет использовать O (1), а не O (n), где n - это длина константы для исходных строк.
>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
Ответ 6
@Нед Бэтчелдер и @newacct дали правильный ответ, но...
На всякий случай, если в вашей строке есть запятая (,) decimal (.):
import re
re.sub("[^\d\.]", "", "$1,999,888.77")
'1999888.77'
Ответ 7
У меня недостаточно репутации, но я попробовал решение во втором наиболее популярном комментарии (fooobar.com/questions/71105/...). была обратная связь, и я исправил ее. я полагаю, что должно быть "[]" для понимания списка?
def strip_nonnumerics(s):
return ''.join([i for i in s if i.isdigit()])
Ответ 8
user = (input):
print ("hello")