Заменить нечисловые символы - PullRequest
       0

Заменить нечисловые символы

10 голосов
/ 04 сентября 2010

Мне нужно заменить нечисловые символы из строки.

Например, "8-4545-225-144" должно быть "84545225144"; «$ 334fdf890 == -» должно быть «334890».

Как я могу это сделать?

Ответы [ 6 ]

18 голосов
/ 04 сентября 2010
''.join(c for c in S if c.isdigit())
17 голосов
/ 04 сентября 2010

Возможно с регулярным выражением.

import re

...

return re.sub(r'\D', '', theString)
3 голосов
/ 19 сентября 2010

filter(str.isdigit, s) быстрее и IMO яснее, чем все остальное, перечисленное здесь.

Он также выдаст ошибку TypeError, если s является типом Unicode.В зависимости от того, какое определение «цифр» вы хотите, это может быть более или менее полезным, чем альтернатива filter(type(s).isdigit, s), немного медленнее, но все же быстрее, чем версии для меня и понимания.

Редактировать: Хотя, если вы плохо работаете с Python 3, вам нужно будет использовать "".join(filter(str.isdigit, s)), который твердо ставит вас на уровень эквивалентно плохой производительности.Такой прогресс.

1 голос
/ 19 сентября 2010

Давайте посчитаем версии join и re:

In [3]: import re

In [4]: def withRe(theString): return re.sub('\D', '', theString)
   ...:

In [5]:

In [6]: def withJoin(S): return ''.join(c for c in S if c.isdigit())
   ...:


In [11]: s = "8-4545-225-144"

In [12]: %timeit withJoin(s)
100000 loops, best of 3: 6.89 us per loop

In [13]: %timeit withRe(s)
100000 loops, best of 3: 4.77 us per loop

Версия join намного лучше, чем версия re, но, к сожалению, на 50% медленнее.Так что, если производительность - проблема, элегантность, возможно, придется пожертвовать.

РЕДАКТИРОВАТЬ

In [16]: def withFilter(s): return filter(str.isdigit, s)
   ....:
In [19]: %timeit withFilter(s)
100000 loops, best of 3: 2.75 us per loop

Похоже, filter является победителем производительности и читаемости

0 голосов
/ 05 сентября 2010

Я предпочитаю регулярные выражения, так что если вам нравится

import re
myStr = '$334fdf890==-'
digts = re.sub('[^0-9]','',myStr) 

, это способ заменить все нечисловые вхождения на '', т. Е. Ни на что.Таким образом, переменная digts должна быть '334890'

0 голосов
/ 04 сентября 2010

Хотя это немного сложнее в настройке, использование строкового метода translate() для удаления символов, как показано ниже, может в 4-6 раз быстрее, чем использование join() или re.sub() в соответствии с проведенными мною временными тестами. - поэтому, если это что-то делается много раз, вы можете рассмотреть возможность использования этого вместо

nonnumerics = ''.join(c for c in ''.join(chr(i) for i in range(256)) if not c.isdigit())

astring = '123-$ab #6789'
print astring.translate(None, nonnumerics)
# 1236789
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...