Удалите все вхождения нескольких символов из строки
Существует ли питонический способ сделать то, что делает метод 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'
>>>