Строки в 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)
. Я думаю, довольно сжато и эффективно. Конечно, он возвращает новую строку, которой вы должны будете присвоить имя.