Удалите все вхождения нескольких символов из строки

Существует ли питонический способ сделать то, что делает метод str.strip(), за исключением всех вхождений, а не только в начале и в конце строки?

Пример:

>> '::2012-05-14 18:10:20.856000::'.strip(' -.:')
>> '2012-05-14 18:10:20.856000'

Я хочу

>> '::2012-05-14 18:10:20.856000::'.crazy_function(' -.:')
>> '20120514181020856000'

Предоставляет ли Python встроенный crazy_function

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

Ответы

Ответ 1

Используйте функцию translate для удаления нежелательных символов:

>>> '::2012-05-14 18:10:20.856000::'.translate(None, ' -.:')
'20120514181020856000'

Убедитесь, что ваша строка имеет тип str, а не unicode, поскольку параметры функции не будут одинаковыми. Для unicode используйте следующий синтаксис; он состоит в построении dict ординалов юникода из символов для удаления и сопоставления их с None:

>>> u'::2012-05-14 18:10:20.856000::'.translate({ord(k):None for k in u' -.:'})
u'20120514181020856000'

Некоторые тайминги для сравнения производительности с re:

>>> timeit.timeit("""re.sub(r"[ -.:]", r"", "'::2012-05-14 18:10:20.856000::'")""","import re")
7.352270301875713
>>> timeit.timeit("""'::2012-05-14 18:10:20.856000::'.translate(None, ' -.:')""")
0.5894893344550951

Ответ 2

Вы можете сделать это достаточно легко с помощью re.sub

>>> import re
>>> re.sub(r"[ -.:]", r"", "'::2012-05-14 18:10:20.856000::'")
'20120514181020856000'
>>> 

Ответ 3

Нет. Я не думаю, что есть встроенный.

Я бы сделал это следующим образом:

>>> s = '::2012-05-14 18:10:20.856000::'
>>> 
>>> ''.join(x for x in s if x not in ' -.:')
'20120514181020856000'
>>>