Дополнительно
Удаление определенных символов из строки в Python
Я'пытаюсь удалить определенные символы из строки с помощью Python. Вот код, который я использую сейчас. К сожалению, он ничего не делает со строкой.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Как мне правильно это сделать?
488
20
Строки в Python являются неизменяемыми (не могут быть изменены). Поэтому эффект от
line.replace(...)
заключается в создании новой строки, а не в изменении старой. Вам нужно перепривязать (присвоить) ее кline
, чтобы эта переменная приняла новое значение с удаленными символами.Кроме того, способ, которым вы это делаете, будет довольно медленным, относительно. Это также, вероятно, немного запутает опытных питонистов, которые увидят дважды вложенную структуру и на мгновение подумают, что происходит что-то более сложное.
Начиная с Python 2.6 и более новых версий Python 2.x *, вы можете вместо этого использовать
str.translate
, (но об отличиях Python 3 читайте далее):или замену регулярного выражения с помощью
re.sub
Символы, заключенные в скобки, представляют собой класс символов. Любые символы в
line
, входящие в этот класс, заменяются вторым параметромsub
: пустой строкой.В Python 3 строки являются кодом Unicode. Вам придется переводить немного по-другому. kevpie упоминает об этом в комментарии к одному из ответов, и это отмечено в документации к
str.translate
.При вызове метода
translate
строки Unicode нельзя передавать второй параметр, который мы использовали выше. Вы также не можете передатьNone
в качестве первого параметра или даже таблицу переводов изstring.maketrans
. Вместо этого в качестве единственного параметра передается словарь. Этот словарь отображает ординальные значения символов (т.е. результат вызоваord
для них) на порядковые значения символов, которые должны их заменить, или - что очень полезно для нас -None
, чтобы указать, что они должны быть удалены.Таким образом, чтобы проделать вышеописанный танец со строкой Unicode, вы должны вызвать что-то вроде
Здесь
dict.fromkeys
иmap
используются для лаконичного создания словаря, содержащегоЕще проще, как сказано в другом ответе, создать словарь на месте:
* Для совместимости с более ранними версиями Python, вы можете создать "null" таблицу перевода для передачи вместо
None
:Здесь
string.maketrans
используется для создания таблицы перевода, которая является просто строкой, содержащей символы с порядковыми значениями от 0 до 255.Я что-то недопонимаете, или это просто следующее:
``питон строка = "и ab1cd1ef и" строку.заменить (на"1" и" Ну и")
строки для печати
результат: "по абвгде и"
``
Положить его в цикле:
``puthon а = "а!б@с#д&Я$; Б = и"!@#$&и" для гольца в б: а = а.заменить(Чара, и" и")
распечатать
результат: Любовь"и
``
Пример ###
Объяснение
В регулярные выражения (регулярные выражения),
|
- это логическое ИЛИ и избегает пробелов и специальных символов, которые могут быть команды регулярного выражения. В то время каксуб
расшифровывается замена в этом случае с пустой строкой''
.Для обратной требование только позволяет некоторые символы в строке, вы можете использовать регулярные выражения с оператором дополнением
[^ABCabc]
. Например, чтобы удалить все, кроме букв ASCII, цифры и дефис:От регулярное выражение Python документация:
Автор вопроса почти получилось. Как и большинство вещей в Python, ответ проще, чем вы думаете.
Вы Don'т придется делать вложенные if/for цикл вещь, но вы должны проверить каждый символ в отдельности.
Строки в Python неизменяемы. Метод
replace
возвращает новую строку после замены. Попробуйте:Я был удивлен, что никто еще не рекомендовал использовать встроенный <б>фильтр</б> функция.
Скажем, мы хотим отфильтровать все, что это'т ряд. Используя фильтр встроенный способ " и...эквивалентный генератор выражение (элемент для элемента в массиве, если функция(элемент)), что" [<а href="и https://docs.python.org/3/library/functions.html#filter">питон 3 примитивы: <и>фильтр</а></а>]
В Python 3 это возвращается
Чтобы получить печатную строку,
Я не уверен, как <б>фильтр</б> ряды с точки зрения эффективности, но это хорошая вещь, чтобы знать, как использовать, когда делаешь список осмысленностей и такие.
Обновление
Логично, так как фильтр работает, вы могли бы также использовать список понимание и от того, что я читал это должно быть более эффективно, потому что лямбда-выражения являются настенные менеджеры-стрит хедж-фонд, функция программирования мира. Еще один плюс заключается в том, что это один-лайнер, который не требует никакого импорта. Например, используя ту же строку 'с' определено выше,
Что's оно. Возвращение будет строка всех символов, цифр в исходной строке.
Если у вас есть конкретный список допустимых и недопустимых символов, вам нужно только отрегулировать 'если бы' части списка понимания.
или,наоборот,
Используя
фильтр
, Вы'd только одна строкаЭто относится к строке, как и проверяет, повторяемое каждый персонаж при
лямбда
возвращаетtrue
:Здесь's некоторые возможные пути достижения этой задачи:
ЗЫ: вместо того, чтобы использовать и" ?.!/;:" в этих примерах гласные... и да, на "карьер" это испанское слово сказать летучая мышь... смешное слово, так как он содержит все гласные :)
ПС2: если вы'повторно заинтересованы в производительности вы могли бы измерить эти попытки с помощью простого кода:
В моей коробке вы'd получите:
Так что, похоже attempt4 является самым быстрым для данного ввода.
Здесь's мой питон 2/3 совместимую версию. Поскольку перевод API изменилось.
Как насчет этого:
Вы также можете использовать функцию для того, чтобы заменить другой вид регулярного выражения или другие модели с использованием списка. С этим, вы можете смешанный регулярное выражение, классовый характер, и очень простой текстовый шаблон. Это's действительно полезно, когда вам нужно заменить много элементов, как HTML и близких.
*Примечание: работает с Python 3.х
В string_cleanup функция принимает строку X и свой список notwanted в качестве аргументов. Для каждого элемента в списке элементов, или узор, если нужно заменить, это будет сделано.
Вывод:
Мой способ я'd с помощью, наверное, не'т работать так же эффективно, но это очень просто. Я могу удалить несколько символов в разных позициях одновременно, используя нарезания и форматирования. Здесь'ы пример:
Это приведет к 'удалено' держать слово 'Это'.
Форматирование может быть очень полезно для печати переменных на полпути через строку печать. В него можно вставить любой тип данных с помощью %, после чего переменная's данные Тип; все типы данных можно использовать %х, а плавает (ака десятичные числа) и целые числа, можно использовать %д.
Нарезки могут быть использованы для четкого управления строками. Когда я положил слова[:3], это позволяет мне выбрать все символы в строке от начала (двоеточие перед номером, это будет означать, что 'С самого начала') в 4-й персонаж (он включает в себя 4-й персонаж). Причина 3 составляет до 4-й позиции, потому что Python начинается с 0. Потом, когда я положил слово[-1:], это означает, 2-ой последний символ (двоеточие после номера). Поставив -1 будет рассчитывать на Python от последнего символа, а не первый. Опять же, питон начнется в 0. Так, слово[-1:] в основном означает, что 'из Второго последнего символа до конца строки.
Так, путем отсечения символов перед знаком, я хочу удалить и символы после и прослаивая их вместе, я могу удалить нежелательный характер. Думайте о нем, как колбаса. В середине он'ы грязные, поэтому я хочу избавиться от него. Я просто отрезают два конца я хочу, чтобы потом сложить их вместе без нежелательных часть в середине.
Если я хочу удалить несколько символов подряд, я просто сместить цифры в [] (отрезать часть). Или если я хочу удалить несколько персонажей с разных позиций, я могу просто бутерброд несколько ломтиков сразу.
Примеры:
удалено равна 'круто'.
удалено равна 'маки'.
В этом случае, [3:5] означает символ в установки 3 через символ в установки 5 (за исключением символа в конечной позиции).
Помните, Python начинается отсчет с 0, так что вам будет нужно так же.
Метод строку "заменить" не изменяет исходную строку. Он оставит в покое и возвращает измененную копию.
Что вы хотите, что-то вроде:
линия=.заменить(Чара,'')
Однако, создавая новую строку каждый раз, что персонаж удален, очень неэффективно. Вместо этого я рекомендую следующее:
Попробуйте это:
Этот метод хорошо работает в Python 3.5.2