Строки в Python неизменны (не может быть изменено).Из-за этого line.replace(...)
просто создает новую строку, а не заменяет старую.Вам нужно перепривязать (присвоить) его line
, чтобы эта переменная приняла новое значение без удаления этих символов.
Кроме того, способ, которым вы это делаете, идетбыть немного медленным, относительно.Вероятно, это будет немного смущать опытных питонаторов, которые увидят дважды вложенную структуру и на мгновение подумают, что происходит нечто более сложное.
Начиная с Python 2.6 и более новых версий Python 2.x*, вместо этого вы можете использовать str.translate
, (но читайте дальше для различий Python 3):
line = line.translate(None, '!@#$')
или замена регулярного выражения на re.sub
import re
line = re.sub('[!@#$]', '', line)
Символы, заключенные в скобки, составляют класс символов .Любые символы в line
, которые находятся в этом классе, заменяются вторым параметром на sub
: пустой строкой.
В Python 3 строки - это Unicode.Вам придется переводить немного по-другому.kevpie упоминает это в комментарии к одному из ответов, и это отмечается в документации для str.translate
.
При вызове метода translate
дляСтрока Unicode, вы не можете передать второй параметр, который мы использовали выше.Вы также не можете передать None
в качестве первого параметра или даже таблицу перевода из string.maketrans
.Вместо этого вы передаете словарь в качестве единственного параметра.Этот словарь отображает порядковые значения символов (т. Е. Результат вызова ord
для них) в порядковые значения символов, которые должны их заменить, или, что нам полезно,None
, чтобы указать, что они должны быть удалены.
Таким образом, чтобы выполнить вышеупомянутый танец со строкой Unicode, вы бы назвали что-то вроде
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Здесь dict.fromkeys
и map
используются для краткой генерации словаря, содержащего
{ord('!'): None, ord('@'): None, ...}
Еще проще, так как другой ответ помещает его , создайте словарь на месте:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
* для совместимости с более ранними Pythons, вы можете создать «нулевую» таблицу перевода для передачи вместо None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Здесь string.maketrans
используется для создания таблицы перевода , которая представляет собой просто строку, содержащую символы с порядковыми значениями от 0 до 255.