Удаление всех нечисловых символов из строки в Python - PullRequest
112 голосов
/ 08 августа 2009

Как удалить все нечисловые символы из строки в Python?

Ответы [ 6 ]

217 голосов
/ 08 августа 2009
>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'
76 голосов
/ 08 августа 2009

Не уверен, что это самый эффективный способ, но:

>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'

Часть ''.join означает объединение всех полученных символов без каких-либо символов между ними. Тогда остальное это понимание списка, где (как вы, вероятно, можете догадаться) мы берем только те части строки, которые соответствуют условию isdigit.

13 голосов
/ 07 сентября 2009

Это должно работать для строк и объектов 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))
5 голосов
/ 07 сентября 2012

Чтобы добавить еще один параметр в микс, в модуле string есть несколько полезных констант. Хотя они более полезны в других случаях, их можно использовать здесь.

>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'

В модуле есть несколько констант, в том числе:

  • ascii_letters (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)
  • hexdigits (0123456789abcdefABCDEF)

Если вы интенсивно используете эти константы, может оказаться целесообразным преобразовать их в frozenset. Это позволяет искать O (1), а не O (n), где n - длина константы для исходных строк.

>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
5 голосов
/ 08 августа 2009

Самый быстрый подход, если вам нужно выполнить более одной или двух таких операций удаления (или даже только одну, но с очень длинной строкой! -), это полагаться на метод 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, чем для байтовых строк, кстати:

>>> 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'
>>> 
1 голос
/ 09 ноября 2018

@ Нед Бэтчелдер и @newacct дали правильный ответ, но ...

На всякий случай, если в строке есть запятая (,) десятичная (.):

import re
re.sub("[^\d\.]", "", "$1,999,888.77")
'1999888.77'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...