Рядки в 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)
. Дуже лаконічно і ефективно, я думаю. Звичайно, він повертає новий рядок, якому вам доведеться призначити ім'я.