Строки в 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в качестве первого параметра. Вместо этого вы передаете таблицу перевода (обычно словарь) как единственный параметр. Эта таблица отображает порядковые значения символов (т. Е. Результат обращения 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 '!@#$'})
Или создайте ту же таблицу перевода с str.maketrans:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* для совместимости с более ранними Pythons, вы можете создать «нулевую» таблицу перевода для передачи вместо None:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Здесь string.maketransиспользуется для создания таблицы перевода , которая представляет собой просто строку, содержащую символы с порядковыми значениями от 0 до 255.
filterфункции и лямбда - выражения:filter(lambda ch: ch not in " ?.!/;:", line). Я думаю, довольно сжато и эффективно. Конечно, он возвращает новую строку, которой вы должны будете присвоить имя.