Напишите программу которая заменяет во всей строке одну последовательность символов на другую python
Перейти к содержимому

Напишите программу которая заменяет во всей строке одну последовательность символов на другую python

  • автор:

Напишите программу которая заменяет во всей строке одну последовательность символов на другую python

anitabled

PYTHON
Напишите программу, которая заменяет во всей строке одну последовательность сим-волов на другую.

(X > 0) and (Y < X) and (Z > Y) and (Z <> 5)

Answers & Comments

Ответ:

print(input(‘Введите строку: ‘).replace(input(‘Что меняем: ‘), input(‘Чем заменить: ‘)));

Напишите программу которая заменяет во всей строке одну последовательность символов на другую python

Рассмотрим основные методы строк, которые мы можем применить в приложениях:

isalpha() : возвращает True, если строка состоит только из алфавитных символов

islower() : возвращает True, если строка состоит только из символов в нижнем регистре

isupper() : возвращает True, если все символы строки в верхнем регистре

isdigit() : возвращает True, если все символы строки — цифры

isnumeric() : возвращает True, если строка представляет собой число

startswith(str) : возвращает True, если строка начинается с подстроки str

endswith(str) : возвращает True, если строка заканчивается на подстроку str

lower() : переводит строку в нижний регистр

upper() : переводит строку в вехний регистр

title() : начальные символы всех слов в строке переводятся в верхний регистр

capitalize() : переводит в верхний регистр первую букву только самого первого слова строки

lstrip() : удаляет начальные пробелы из строки

rstrip() : удаляет конечные пробелы из строки

strip() : удаляет начальные и конечные пробелы из строки

ljust(width) : если длина строки меньше параметра width, то справа от строки добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по левому краю

rjust(width) : если длина строки меньше параметра width, то слева от строки добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по правому краю

center(width) : если длина строки меньше параметра width, то слева и справа от строки равномерно добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по центру

find(str[, start [, end]) : возвращает индекс подстроки в строке. Если подстрока не найдена, возвращается число -1

replace(old, new[, num]) : заменяет в строке одну подстроку на другую

split([delimeter[, num]]) : разбивает строку на подстроки в зависимости от разделителя

partition(delimeter) : разбивает строку по разделителю на три подстроки и возвращает кортеж из трех элементов — подстрока до разделителя, разделитель и подстрока после разделителя

join(strs) : объединяет строки в одну строку, вставляя между ними определенный разделитель

Например, если мы ожидаем ввод с клавиатуры числа, то перед преобразованием введенной строки в число можно проверить, с помощью метода isnumeric() введено ли в действительности число, и если так, то выполнить операцию преобразования:

Проверка, начинается или оканчивается строка на определенную подстроку:

Удаление пробелов в начале и в конце строки:

Дополнение строки пробелами и выравнивание:

Поиск в строке

Для поиска подстроки в строке в Python применяется метод find() , который возвращает индекс первого вхождения подстроки в строку и имеет три формы:

find(str) : поиск подстроки str ведется с начала строки до ее конца

find(str, start) : параметр start задает начальный индекс, с которого будет производиться поиск

find(str, start, end) : параметр end задает конечный индекс, до которого будет идти поиск

Если подстрока не найдена, метод возвращает -1:

Замена в строке

Для замены в строке одной подстроки на другую применяется метод replace() :

replace(old, new) : заменяет подстроку old на new

replace(old, new, num) : параметр num указывает, сколько вхождений подстроки old надо заменить на new. По умолчанию num равно -1, что соответствует первой версии метода и приводит к замене всех вхождений.

Разделение на подстроки

Метод split() разбивает строку на список подстрок в зависимости от разделителя. В качестве разделителя может выступать любой символ или последовательность символов. Данный метод имеет следующие формы:

split() : в качестве разделителя используется пробел

split(delimeter) : в качестве разделителя используется delimeter

split(delimeter, num) : параметр num указывает, сколько вхождений delimeter используется для разделения. Оставшаяся часть строки добавляется в список без разделения на подстроки

Еще один метод — partition() разбивает строку по разделителю на три подстроки и возвращает кортеж из трех элементов — подстрока до разделителя, разделитель и подстрока после разделителя:

Если разделитель с строке не найден, то возвращается кортеж с одной строкой.

Соединение строк

При рассмотрении простейших операций со строками было показано, как объединять строки с помощью операции сложения. Другую возможность для соединения строк представляет метод join() : он объединяет список строк. Причем текущая строка, у которой вызывается данный метод, используется в качестве разделителя:

Вместо списка в метод join можно передать простую строку, тогда разделитель будет вставляться между символами этой строки:

Напишите программу которая заменяет во всей строке одну последовательность символов на другую python

Строка считывается со стандартного ввода функцией input() . Напомним, что для двух строк определена операция сложения (конкатенации), также определена операция умножения строки на число.

Строка состоит из последовательности символов. Узнать количество символов (длину строки) можно при помощи функции len .

Любой другой объект в Питоне можно перевести к строке, которая ему соответствует. Для этого нужно вызвать функцию str() , передав ей в качестве параметра объект, переводимый в строку.

2. Срезы (slices)

Срез (slice) — извлечение из данной строки одного символа или некоторого фрагмента подстроки или подпоследовательности.

Есть три формы срезов. Самая простая форма среза: взятие одного символа строки, а именно, S[i] — это срез, состоящий из одного символа, который имеет номер i . При этом считается, что нумерация начинается с числа 0. То есть если , то , , , , .

Номера символов в строке (а также в других структурах данных: списках, кортежах) называются индексом.

Если указать отрицательное значение индекса, то номер будет отсчитываться с конца, начиная с номера -1 . То есть , , , , .

Или в виде таблицы:

Строка S H e l l o
Индекс S[0] S[1] S[2] S[3] S[4]
Индекс S[-5] S[-4] S[-3] S[-2] S[-1]

Если же номер символа в срезе строки S больше либо равен len(S) , или меньше, чем -len(S) , то при обращении к этому символу строки произойдет ошибка IndexError: string index out of range .

Срез с двумя параметрами: S[a:b] возвращает подстроку из b — a символов, начиная с символа c индексом a , то есть до символа с индексом b , не включая его. Например, S[1:4] == ‘ell’ , то же самое получится если написать S[-4:-1] . Можно использовать как положительные, так и отрицательные индексы в одном срезе, например, S[1:-1] — это строка без первого и последнего символа (срез начинается с символа с индексом 1 и заканчиватеся индексом -1, не включая его).

При использовании такой формы среза ошибки IndexError никогда не возникает. Например, срез S[1:5] вернет строку ‘ello’ , таким же будет результат, если сделать второй индекс очень большим, например, S[1:100] (если в строке не более 100 символов).

Если опустить второй параметр (но поставить двоеточие), то срез берется до конца строки. Например, чтобы удалить из строки первый символ (его индекс равен 0), можно взять срез S[1:] . Аналогично если опустить первый параметр, то можно взять срез от начала строки. То есть удалить из строки последний символ можно при помощи среза S[:-1] . Срез S[:] совпадает с самой строкой S .

Любые операции среза со строкой создают новые строки и никогда не меняют исходную строку. В Питоне строки вообще являются неизменяемыми, их невозможно изменить. Можно лишь в старую переменную присвоить новую строку.

На самом деле в питоне нет и переменных. Есть лишь имена, которые связаны с какими-нибудь объектами. Можно сначала связать имя с одним объектом, а потом — с другим. Можно несколько имён связать с одним и тем же объектом.

Если задать срез с тремя параметрами S[a:b:d] , то третий параметр задает шаг, как в случае с функцией range , то есть будут взяты символы с индексами a , , и т. д. При задании значения третьего параметра, равному 2, в срез попадет кажый второй символ, а если взять значение среза, равное -1 , то символы будут идти в обратном порядке. Например, можно перевернуть строку срезом S[::-1] .

Замена нескольких символов на Python

Мне нужно заменить некоторые символы следующим образом: & → \& , # → \# .

Я закодировал следующим образом, но я думаю, что должен быть лучший способ. Любые подсказки?

7 ответов

Замена двух символов

Я приурочил все методы в текущих ответах вместе с одним дополнительным.

С входной строкой abc&def#ghi и заменой и → \& и # → #, самым быстрым было объединение цепочек следующим образом: text.replace(‘&’, ‘\&’).replace(‘#’, ‘\#’) .

Сроки для каждой функции:

  • a) 1000000 циклов, лучше всего 3: 1,47 мкс на петлю.
  • b) 1000000 циклов, лучше всего 3: 1,51 мкс за цикл
  • c) 100000 циклов, лучше всего 3: 12,3 мкс на петлю.
  • d) 100000 циклов, лучше всего 3: 12 мкс на петлю
  • e) 100000 циклов, лучше всего 3: 3,27 мкс на петлю
  • f) 1000000 циклов, лучше всего 3: 0.817 мкс за цикл
  • g) 100000 циклов, лучше всего 3: 3,64 мкс на петлю
  • h) 1000000 циклов, лучше всего 3: 0.927 мкс за цикл
  • i) 1000000 циклов, лучше всего 3: 0.814 мкс за цикл

Замена 17 символов

Здесь аналогичный код, чтобы сделать то же самое, но с большим количеством символов для выхода (\ `* _ <> > # + -.! $):

Здесь результаты для той же вводной строки abc&def#ghi :

  • a) 100000 циклов, лучше всего 3: 6.72 мкс на петлю
  • b) 100000 циклов, лучше всего 3: 2.64 мкс за цикл
  • c) 100000 циклов, лучше всего 3: 11,9 мкс за цикл
  • d) 100000 циклов, лучше всего 3: 4,92 мкс на петлю
  • e) 100000 циклов, лучше всего 3: 2,96 мкс за цикл
  • f) 100000 циклов, лучше всего 3: 4,29 мкс за цикл
  • g) 100000 циклов, лучше всего 3: 4,68 мкс на петлю
  • h) 100000 циклов, лучше всего 3: 4,73 мкс на петлю
  • i) 100000 циклов, лучше всего 3: 4,24 мкс за цикл

И с более длинной входной строкой ( ## *Something* and [another] thing in a longer sentence with things to replace$ ):

  • a) 100000 циклов, лучше всего 3: 7,59 мкс на петлю
  • b) 100000 циклов, лучше всего 3: 6,54 мкс на петлю.
  • c) 100000 циклов, лучше всего 3: 16,9 мкс на петлю.
  • d) 100000 циклов, лучше всего 3: 7,29 мкс на петлю
  • e) 100000 циклов, лучше всего 3: 12,2 мкс на петлю
  • f) 100000 циклов, лучше всего 3: 5,38 мкс за цикл
  • g) 10000 циклов, лучше всего 3: 21,7 мкс на петлю
  • h) 100000 циклов, лучше всего 3: 5,7 мкс за цикл
  • i) 100000 циклов, лучше всего 3: 5,13 мкс за цикл

Добавление нескольких вариантов:

С более коротким входом:

  • ab) 100000 циклов, лучше всего 3: 7,05 мкс за цикл
  • ba) 100000 циклов, лучше всего 3: 2,4 мкс на петлю

С более длинным входом:

  • ab) 100000 циклов, лучше всего 3: 7,71 мкс за цикл
  • ba) 100000 циклов, лучше всего 3: 6,08 мкс на петлю

Поэтому я буду использовать ba для удобства чтения и скорости.

Добавление

Подсказка по сообщениям в комментариях, одна разница между ab и ba — это проверка if c in text: . Пусть тестируют их еще на двух вариантах:

Времена в мкс за цикл на Python 2.7.14 и 3.6.3 и на другой машине из более раннего набора, поэтому нельзя сравнивать напрямую.

Можно заключить, что:

Те, у кого проверка, до 4 раз быстрее, чем те, у кого нет проверки

ab_with_check немного впереди на Python 3, но ba (с проверкой) имеет большее лидерство на Python 2

Однако самый большой урок здесь: Python 3 до 3 раз быстрее, чем Python 2! Там нет большой разницы между самым медленным на Python 3 и самым быстрым на Python 2!

1000 символов) str.translate выполняется быстрее, чем все описанные методы.

Просто соедините функции replace следующим образом

Если замена будет больше числа, вы можете сделать это общим способом

Вы всегда будете добавлять обратную косую черту? Если да, попробуйте

Это может быть не самый эффективный метод, но я думаю, что это самый простой.

Вы можете рассмотреть возможность создания общей функции эвакуации:

Таким образом вы можете настроить свою функцию со списком символов, который должен быть экранирован.

FYI, это мало или вообще не используется для OP, но может быть полезным для других читателей (пожалуйста, не используйте downvote, я знаю об этом).

Как несколько смешное, но интересное упражнение, хотелось бы посмотреть, могу ли я использовать функциональное программирование на python для замены нескольких символов. Я почти уверен, что это не бит, просто вызывающий replace() дважды. И если производительность была проблемой, вы могли бы легко победить это в ржавчине: C, julia, perl, java, javascript и, возможно, даже awk. Он использует внешний пакет «помощников» под названием pytoolz, ускоренный с помощью cython (cytoolz, это пакет pypi).

Я даже не собираюсь это объяснять, потому что никто не стал бы использовать это, чтобы выполнить множественную замену. Тем не менее, я чувствовал себя немного уверенным в этом и думал, что это может вдохновить других читателей или выиграть конкурс по запуску кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *