Символьные строки

r

Символьная строка – это последовательность символов, расположенных в памяти рядом (в соседних ячейках). Для работы с символами во многих языках программирования есть переменные специального типа: символы, символьные массивы и символьные строки (которые, в отличие от массивов, рассматриваются как цельные объекты). Основной тип данных для работы с символьными величинами в языке Python – это символьные строки (тип string).

Операции со строками

Объединения (сцепления) строк

Оператор '+' . Эта операция иногда называется конкатенация. Например:
s1 = "Привет"
s2 = "Вася"
s = s1 + ", " + s2 + "!"

r

В результате выполнения приведённой программы в строку s будет записано значение "Привет, Вася!".

Выделение части строки (подстроки)

Применяется операция получения среза (англ. slicing), например s[3:8] означает символы строки s с 3-го по 7-й (то есть до 8-го, не включая его). Следующий фрагмент копирует в строку s1 символы строки s с 3-го по 7-й (всего 5 символов):
s = "0123456789"
s1 = s[3:8]

r

В строку s1 будет записано значение "34567".

Удаление части строк

Для удаления части строки нужно составить новую строку, объединив части исходной строки до и после удаляемого участка: s = "0123456789" s1 = s[:3] + s[9:]

r

Срез s[:3] означает «от начала строки до символа s[3], не включая его», а запись s[9:] – «все символы, начиная с s[9] до конца строки». Таким образом, в переменной s1 остаётся значе- ние "0129".

Срезы

С помощью срезов можно вставить новый фрагмент внутрь строки: s = "0123456789"
s1 = s[:3] + "ABC" + s[3:]

r

Переменная s получит значение "012ABC3456789".

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

Срезы позволяют выполнить реверс строки (развернуть её наоборот):
s1 = s[::-1]

r

Так как начальный и конечный индексы элементов строки не указаны, задействована вся строка. Число «–1» означает шаг изменения индекса и говорит о том, что все символы перебираются в обратном порядке.

Встроенные методы для работы с символьными строками.

Методы upper и lower позволяют перевести строку соответственно в верхний и нижний регистр: s = "aAbBcC"
s1 = s.upper() # "AABBCC" s2 = s.lower() # "aabbcc"

Метод isdigit проверяет, все ли символы строки – цифры, и возвращает логическое значение: s = "abc"
print ( s.isdigit() ) # False s1 = "123"
print ( s1.isdigit() ) # True

Пример обработки строк

Срезы и метод find

r

Полная программа:print( "Введите имя, отчество и фамилию:" ) s = input()n=s.find( " " )name=s[:n] #вырезать имяs = s[n+1:]n=s.find( " " )name2=s[:n] #вырезать отчество s=s[n+1:] #осталась фамилия s=s+" "+ name[0]+"."+name2[0]+"."print( s )

Метод split, который возвращает спи- сок слов, полученных при разбиении строки

r

Полная программа:print( "Введите имя, отчество и фамилию:" ) s = input()fio = s.split()s=fio[2]+" "+fio[0][0]+"."+fio[1][0]+"." print( s )

Рекурсивный перебор

Это типичная задача на перебор вариантов, которую удобно свести к задаче меньшего размера. Процедура для перебора слов может быть записана так: def TumbaWords( A, w, L ): if len(w)==L:
print( w )
return
for c in A:
TumbaWords( A, w+c, L )

r

В параметре A передаётся алфавит языка, параметр w – это уже построенная часть слова, а L – нужная длина слова. Когда длина построенного слова станет равна L, то есть будет получено слово требуемой длины, слово выводится на экран и происходит выход из процедуры (окончание рекурсии). Если слово не достроено, в цикле перебираем все символы, входящие в алфавит, по очереди добавляем каждый из них в конец строки и вызываем процедуру рекурсивно.

Сравнение и сортировка строк

Строки, как и числа, можно сравнивать. Для строк, состоящих из одних букв (русских или ла- тинских), результат сравнения очевиден: меньше будет та строка, которая идет раньше в алфавит- ном порядке.

С другими символами (цифрами, латинскими буквами)?

Цифры стоят в кодовой
таблице по порядку, причём раньше, чем латинские буквы; латинские буквы – раньше, чем русские; заглавные буквы (русские и латинские) – раньше, чем соответствующие строчные. Поэтому
«5STEAM» < «STEAM» < «Steam» < «steam» < «ПАР» < «Пар» < «пар».

С помощью языка Python удобно записать строки в массив (список) и затем отсортировать с помощью метода sort: aS=[]
print ( "Введите строки для сортировки:" ) while True:
s1 = input()
if s1=="": break aS.append( s1 )
aS.sort(). print( aS )

r

Строки заносятся в список aS. Сначала этот список пустой, затем в цикле мы вводим очередную строку с клавиатуры и записываем её в переменную s1. Ввод заканчивается, когда введена пустая строка, то есть вместо ввода строки пользователь нажал клавишу Enter. В этом случае сработает условный оператор и выполнится оператор break, прерывающий цикл.

Преобразования число<->строка

int – переводит строку в целое число

Пример преобразования строк в числовые значения: s = "123"
N=int( s ) # N = 123

float – переводит строку в вещественное число

Пример преобразования строк в числовые значения: s = "123.456"
X=float( s ) # X = 123.456

str – переводит целое или вещественное число в строку

Примеры обратного преобразования: N=123
s=str( N ) # s = "123"
X = 123.456
s=str( X ) # s = "123.456"

r

Эти операции всегда выполняются успешно (ошибка произойти не может).

Функция str использует правила форматирования, установленные по умолчанию. При необходимости можно использовать собственное форматирование. Например, в строке:
s = "{:5d}".format(N)

r

В строке значение переменной N будет записано по формату d (целое число) в 5 позициях, то есть в начале строки будут стоять два пробела:◦◦123

Для вещественных чисел можно использовать форматы f (с фиксированной точкой) и e (экспоненциальный формат, с плавающей точкой): X = 123.456
s="{:7.2f}".format(X) # s ="◦123.46"
s = "{:10.2e}".format(X) # s= "◦◦ 1.23e+02"

r

В первом случае формат «7.2f» обозначает «вывести в 7 позициях с 2 знаками в дробной части», во втором – формат «10.2e» обозначает «вывести научном формате в 10 позициях с 2 знаками в дробной части».

Поиск в строках

Метод find

Функция find, она определена для символьных строк и вызывается как метод, с помощью точечной записи. В скобках нужно указать образец для поиска: s="Здесь был Вася."
n=s.find( "с" ) # n = 3 if n>=0:
print( "Номер символа", n ) else:
print( "Символ не найден." )

r

Метод find возвращает целое число – номер символа, с которого начинается образец (буква "с") в строке s. Если в строке несколько образцов, функция находит первый из них. Если образец не найден, функция возвращает «–1». В рассмотренном примерев переменную n будет записано число 3.

Метод rfind

r

Аналогичный метод rfind (от англ. reverse find – искать в обратную сторону) ищет послед- нее вхождение образца в строке.

Для той же строки s, что и в предыдущем примере, метод rfind вернёт 12 (индекс последней буквы «с»): s="Здесь был Вася."
n=s.rfind( "с" ) # n = 12

Строки в процедурах и функциях

r

Строки можно передавать в процедуры и функции как параметры, а также возвращать как результат функций. Построим процедуру, которая заменяет в строке s все вхождения слова-образца wOld на слово-замену wNew (здесь wOld и wNew – это имена переменных, а выражение «слово wOld» означает «слово, записанное в переменную wOld»).

Алгоритм выполнения, чтобы избежать проблем: 1) записываем результат в другой символьной строке res, удаляя из строки s уже обработанную часть. Предположим, что на некотором ша- ге в оставшейся части строки s обнаружено слово wOld. Для этого нужно выполнить следующие действия: 1) ту часть строки s, которая стоит слева от образца, «прицепить» в конец строки res;
2) «прицепить» в конец строки res слово-замену wNew;
3) удалить из строки s начальную часть, включая найденное слово-образец.

Функция на языке Python. Её параметры – это исходная строка s, строка-образец wOld и строка-замена wNew:
def replaceAll( s, wOld, wNew ): lenOld = len(wOld)
res=""
while len(s) > 0:
p=s.find( wOld ) if p<0:
return res + s if p>0:
res = res + s[:p] res=res+wNew
if p+lenOld>=len(s):
s="" else:
s = s[p+lenOld:] return res

r

Переменная p – это номер первого символа первого найденного слова-образца wOld, а в пере- менной lenOld записана длина этого слова. Если после поиска слова значение p меньше нуля (образец не найден), происходит выход из цикла:if  p<0: res=res+s; return Если p > 0, то слева от образца есть какие-то символы, и их нужно «прицепить» к строке res:if p>0: res=res+s[:p] Условие p+lenOld >= len(s) означает «образец стоит в самом конце слова», при этом остаток строки s – пустая строка. В конце программы результат записывается на место исходной строки s. Пример использования этой функции:s = "12.12.12"s=replaceAll( s, "12", "A12B" )print( s ) Так как операция замены одной подстроки на другую используется очень часто, в языке Python есть встроенная функция, которая выполняет эту операцию. Она оформлена как метод для переменных типа «строка» (str) и вызывается с помощью точечной записи:s = "12.12.12"s=s.replace( "12", "A12B" )print( s )