Я пытаюсь удалить определенные символы из строки, используя Python. Это код, который я использую прямо сейчас. К сожалению, похоже, что ничего не делает со строкой.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Как мне сделать это правильно?
python
string
immutability
Мэтт Филлипс
источник
источник
filter
функции и лямбда - выражения:filter(lambda ch: ch not in " ?.!/;:", line)
. Я думаю, довольно сжато и эффективно. Конечно, он возвращает новую строку, которой вы должны будете присвоить имя.Ответы:
Строки в 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
в качестве первого параметра. Вместо этого вы передаете таблицу перевода (обычно словарь) как единственный параметр. Эта таблица отображает порядковые значения символов (т. Е. Результат обращенияord
к ним) с порядковыми значениями символов, которые должны их заменить, или - для нас -None
чтобы указать, что они должны быть удалены.Таким образом, чтобы сделать вышеупомянутый танец со строкой Unicode, вы бы назвали что-то вроде
Здесь
dict.fromkeys
иmap
используются для краткой генерации словаря, содержащегоЕще проще, как говорит другой ответ , создать таблицу перевода на месте:
Или создайте ту же таблицу перевода с
str.maketrans
:* для совместимости с более ранними Pythons, вы можете создать «нулевую» таблицу перевода для передачи вместо
None
:Здесь
string.maketrans
используется для создания таблицы перевода , которая представляет собой просто строку, содержащую символы с порядковыми значениями от 0 до 255.источник
line.translate
принимает только один аргумент, и первое решение не будет работатьline.translate({ord(i):None for i in '!@#$'})
"'"
для набора символов.notes = notes.translate({ord(i):None for i in '\"\''})
unicode_line.translate(str.maketrans('', '', '!@#$'))
. Илиunicode_line.translate(dict.fromkeys(map(ord, '!@#$')))
Я здесь упускаю суть, или это просто следующее:
Поместите это в цикл:
источник
for char in b: a=a.replace(char,"")
string=string.replace("1","")
вместо этого. Вы как-то сказали это в циклической части вашего примера, но большинство людей не будут вдаваться в подробности вашего ответа до тех пор, пока они не возьмутся за код, чтобы немного разобраться с таким простым вопросом.источник
blacklist = set('?:!/;')
а потом''.join(c for c in line if c not in blacklist)
Легко peasy с
re.sub
регулярным выражением от Python 3.5пример
объяснение
В регулярных выражениях (регулярное выражение)
|
представляет собой логическое ИЛИ и\
экранирует пробелы и специальные символы, которые могут быть действительными командами регулярного выражения. Принимая во внимание, чтоsub
означает замену, в этом случае с пустой строкой''
.источник
Для обратного требования разрешать только определенные символы в строке вы можете использовать регулярные выражения с оператором дополнения набора
[^ABCabc]
. Например, чтобы удалить все, кроме букв ascii, цифр и дефиса:Из документации по регулярным выражениям python :
источник
У Аскера почти было это. Как и большинство вещей в Python, ответ проще, чем вы думаете.
Вам не нужно выполнять вложенный цикл if / for, но вам НЕОБХОДИМО проверять каждый символ отдельно.
источник
источник
источник
Строки неизменны в Python.
replace
Метод возвращает новую строку после замены. Пытаться:источник
line
.Я был удивлен, что никто еще не рекомендовал использовать встроенную функцию фильтра .
Скажем, мы хотим отфильтровать все, что не является числом. Использование встроенного метода фильтра «... эквивалентно выражению генератора (элемент для элемента в итерируемой функции (элемент))» [ Python 3 Builtins: Filter ]
В Python 3 это возвращает
Чтобы получить печатную строку,
Я не уверен, как фильтр ранжируется с точки зрения эффективности, но хорошо знать, как его использовать при выполнении списочных вычислений и тому подобное.
ОБНОВИТЬ
Логично, что поскольку фильтр работает, вы также можете использовать понимание списков, и из того, что я прочитал, он должен быть более эффективным, потому что лямбды являются менеджерами хедж-фондов Уолл-стрит в мире функций программирования. Еще одним плюсом является то, что это однострочник, который не требует импорта. Например, используя ту же строку 's', определенную выше,
Вот и все. Возвращаемым будет строка всех символов, которые являются цифрами в исходной строке.
Если у вас есть определенный список допустимых / неприемлемых символов, вам нужно только отрегулировать часть «если» в понимании списка.
или, в качестве альтернативы,
источник
operator.contains
если вы используете вlambda
любом случае.lambda x: operator.contains(intsList, x)
должно быть написаноlambda x: x in intsList
, или если вы пытаетесь получить проверку уровня C,intsList.__contains__
(нетlambda
вообще) добьется цели.Используя
filter
, вам просто понадобится одна строкаЭто обрабатывает строку как итеративную и проверяет каждый символ, если
lambda
возвращаетсяTrue
:источник
Вот несколько возможных способов решения этой задачи:
PS: вместо использования "?.! / ;:" в примерах используются гласные ... и да, "murcielago" - это испанское слово "летучая мышь" ... смешное слово, поскольку оно содержит все гласные :)
PS2: Если вы заинтересованы в производительности, вы можете измерить эти попытки с помощью простого кода вроде:
В моей коробке вы получите:
Так что, похоже, попытка 4 является самой быстрой для этого конкретного ввода.
источник
list
вattempt1
и кортеж может быть переписан"aeiou"
для простоты пользы (удаление[
и]
превратитесь в в генератор без создания списка). Вы создаете тонны одноразовых промежуточных строкattemt2
, вы используете несколько приложений регулярных выражений, вattempt3
которых вы можете использовать ихr'[aeiou]'
за один проход. у каждого есть свои недостатки - приятно видеть разные способы сделать что-то, но, пожалуйста, исправьте их, чтобы они тоже были хорошими попыткамиВот моя Python 2/3 совместимая версия. С тех пор как переводчик API изменился.
источник
dict.fromkeys(map(ord, '!@#$'))
для создания карты.map
как правило, менее читаемо, чем понимание списка / dict / set / generator. Настолько, что Гвидо хотел убрать это из языка . Использованиеfromkeys
также немного умен и требует проверки документов.str.maketrans('', '', chars)
, который обрабатываетord
преобразование иdict
конструкцию все за один раз (не говоря уже о том, чтобы быть более очевидным в намерениях, так как он спарен сstr.translate
).источник
'
как строку. docs.python.org/2/library/re.htmlКак насчет этого:
источник
Вы также можете использовать функцию для замены регулярного выражения другого типа или другого шаблона с использованием списка. При этом вы можете смешивать регулярное выражение, класс символов и действительно базовый текстовый шаблон. Это действительно полезно, когда вам нужно заменить много элементов, таких как HTML.
* Примечание: работает с Python 3.x
В функции string_cleanup она принимает вашу строку x и ваш список нежелательных в качестве аргументов. Для каждого элемента в этом списке элементов или шаблона, если требуется замена, это будет сделано.
Выход:
источник
Мой метод, который я бы использовал, вероятно, не будет работать так же эффективно, но он очень прост. Я могу удалить несколько символов в разных позициях одновременно, используя нарезку и форматирование. Вот пример:
Это приведет к тому, что слово «this» будет «удалено».
Форматирование может быть очень полезным для печати переменных в середине строки печати. Он может вставить любой тип данных, используя %, за которым следует тип данных переменной; все типы данных могут использовать % s , а числа с плавающей запятой (или десятичные числа) и целые числа могут использовать % d .
Нарезка может быть использована для сложного контроля над строками. Когда я помещаю слова [: 3] , это позволяет мне выбрать все символы в строке с начала (двоеточие перед числом, это будет означать «от начала до») до 4-го символа (включая 4-й персонаж). Причина, по которой 3 равняется до 4-й позиции, заключается в том, что Python начинается с 0. Затем, когда я помещаю слово [-1:] , это означает 2-й последний символ в конце (двоеточие находится за числом). Установка -1 приведет к подсчету Python от последнего символа, а не от первого. Снова Python начнется с 0. Итак, слово [-1:] основном означает «от второго последнего символа до конца строки.
Таким образом, обрезая символы перед персонажем, которого я хочу удалить, и символы после и помещая их вместе, я могу удалить нежелательного персонажа. Думайте об этом как о колбасе.В середине это грязно, поэтому я хочу избавиться от этого. Я просто отрезаю два конца, которые хочу, затем соединяю их без ненужной части посередине.
Если я хочу удалить несколько последовательных символов, я просто сдвигаю числа в [] (часть среза). Или, если я хочу удалить несколько символов из разных позиций, я могу просто объединить несколько слайсов одновременно.
Примеры:
удалено равно "круто".
удален равно 'macs'.
В этом случае [3: 5] означает символ в позиции 3 через символ в позиции 5 (исключая символ в конечной позиции).
Помните, что Python начинает считать с 0 , так что вам тоже нужно будет.
источник
Попробуй это:
Этот метод хорошо работает в Python 3.5.2
источник
Вы можете использовать замену регулярного выражения re модуля. Использование выражения ^ позволяет вам выбрать именно то, что вы хотите от вашей строки.
Выходом к этому будет «Thisisabsurd». Появятся только те вещи, которые указаны после символа ^.
источник
Строковый метод
replace
не изменяет исходную строку. Он оставляет оригинал один и возвращает измененную копию.То, что вы хотите, это что-то вроде:
line = line.replace(char,'')
Однако создание новой строки каждый раз, когда удаляется символ, очень неэффективно. Вместо этого я рекомендую следующее:
источник
Ниже один .. без использования концепции регулярных выражений ..
источник
В Python 3.5
например,
Удалить все числа из строки
источник
Вы можете использовать набор
источник
Рекурсивное разбиение: s = строка; символы = символы для удаления
пример:
источник
# для каждого файла в каталоге переименовать имя файла
источник
Даже приведенный ниже подход работает
вывод:
abcde
источник
источник