41 вопрос о работе со строками в python

Методы для работы со строками

Кроме функций, для работы со строками есть немало методов:

  • – возвращает индекс первого вхождения подстроки в s или -1 при отсутствии. Поиск идет в границах от до ;
  • – аналогично, но возвращает индекс последнего вхождения;
  • – меняет последовательность символов на новую подстроку ;
  • – разбивает строку на подстроки при помощи выбранного разделителя x;
  • – соединяет строки в одну при помощи выбранного разделителя x;
  • – убирает пробелы с обеих сторон;
  • – убирает пробелы только слева или справа;
  • – перевод всех символов в нижний регистр;
  • – перевод всех символов в верхний регистр;
  • – перевод первой буквы в верхний регистр, остальных – в нижний.

Примеры использования:

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

Чтобы в Python заменить в строке одну подстроку на другую, применяют метод replace():
• replace(old, new): подстрока old заменяется на new;
• replace(old, new, num): параметр num показывает, сколько вхождений подстроки old требуется заменить на new.

Пример замены в строке в Python:

    phone = "+1-234-567-89-10"

# дефисы меняются на пробелы
edited_phone = phone.replace("-", " ")
print(edited_phone)     # +1 234 567 89 10

# дефисы удаляются
edited_phone = phone.replace("-", "")
print(edited_phone)     # +12345678910

# меняется только первый дефис
edited_phone = phone.replace("-", "", 1)
print(edited_phone)     # +1234-567-89-10

Значение слова Строка по словарю Ушакова:

СТРОКА строки, вин. строку, мн. строки, строкам, ж. 1. Ряд, полоса (спец., обл.). По перепелу и бекасу желтые строки. Даль. 2. Ряд слов, букв или иных знаков (напр. нотных), написанных или напечатанных в одну линию. Быстро принялся считать строки и буквы рукописи, слюнявя пальцы. Мамин-Сибиряк . В строку писать (начинать другую строку без отступа). Под строкой. Красная строка (см. красный). || перен., только мн. Письмо, сочинение, письменное выражение чего-н. В прочувствованных строках он выразил свое соболезнование. Пишущий эти строки (говорится автором о себе). Я прочла в Онегине чудные строки. Некрасов . 3. Ряд переплетенных лык в лапте. Не всякое лыко в строку. Пословица (см. лыко).

Преобразование строк

В С для преобразования строк, содержащих числа, в численные значения в библиотеке stdlib.h предусмотрен следующий набор функций:double atof(const char *string); // преобразование строки в число типа doubleint atoi(const char *string); // преобразование строки в число типа intlong int atol(const char *string); // преобразование строки в число типа long intlong long int atoll(const char *string); // преобразование строки в число типа long long int

Корректное представление вещественного числа в текстовой строке должно удовлетворять формату:

цифры]

После символов E, e указывается порядок числа. Корректное представление целого числа в текстовой строке должно удовлетворять формату:

цифры

Помимо приведенных выше функций в библиотеке stdlib.h доступны также следующие функции преобразования строк в вещественные числа:

float strtof(const char * restrict string, char ** restrict endptr);double strtod(const char * restrict string, char ** restrict endptr);long double strtold(const char * restrict string,char ** restrict endptr);

Аналогичные функции присутствуют и для преобразования строк в целочисленные значения:

long int strtol(const char * restrict string, char ** restrict endptr, int base);unsigned long strtoul(const char * restrict string,char ** restrict endptr, int base);long long int strtoll(const char * restrict string,char ** restrict endptr, int base);unsigned long long strtoull(const char * restrict string,char ** restrict endptr, int base);

Функции обратного преобразования (численные значения в строки) в библиотеке stdlib.h присутствуют, но они не регламентированы стандартом, и рассматриваться не будут. Для преобразования численных значений в строковые наиболее удобно использовать функции sprintf и snprintf.

Значение, возвращаемое при считывании

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

bool is_correct;int a;is_correct = (cin >> a);

Если значение переменной is_correct будет true, то считывание было успешно, иначе — нет.

Вместо записи результата в логическую переменную, можно непосредственно использовать его, например, в условной инструкции. Вот так, например, можно проверять, что на вход программе подано два числа через двоеточие:

int h, m;char c;if (cin >> noskipws >> h >> c >> m){    if (c == ‘:’) …}

Похожее использование — чтение текста «по словам», с обработкой каждого слова:

string word;while (cin >> word){   // Обработать слово в переменной word}

Или считывание текста по строкам:

string line;while (getline(cin, s)){    // Обработать строку в переменной line}

Метод хеширования[править]

Наивный алгоритм поиска подстроки в строке работает за в худшем случае — слишком долго. Чтобы ускорить этот процесс, можно воспользоваться методом .

Определение:
Пусть дана строка . Тогда полиномиальным хешем (англ. polynomial hash) строки называется число , где — некоторое простое число, а код -ого символа строки .

Проблему переполнения при вычислении хешей довольно больших строк можно решить так считать хеши по модулю (или ), чтобы модуль брался автоматически при переполнении типов.

Для работы алгоритма потребуется считать хеш подстроки . Делать это можно следующим образом:

Рассмотрим хеш :

Разобьем это выражение на две части:

Вынесем из последней скобки множитель :

Выражение в первой скобке есть не что иное, как хеш подстроки , а во второй — хеш нужной нам подстроки . Итак, мы получили, что:

Отсюда получается следующая формула для :

Однако, как видно из формулы, чтобы уметь считать хеш для всех подстрок начинающихся с , нужно предпосчитать все для . Это займет много памяти. Но поскольку нам нужны только подстроки размером мы можем подсчитать хеш подстроки , а затем пересчитывать хеши для всех за следующим образом:

.

.

Получается : .

Массивы структур

Работа с массивами структур аналогична работе со статическими массивами других типов данных.

Пример Библиотека из 3 книг

1234567891011121314151617181920212223242526272829303132

#include <stdio.h>#include <stdlib.h>struct book{  char title;  char author;  int value;};int main(){  struct book libry;  int i;  system(«chcp 1251»);  system(«cls»);  for (i = 0; i<3; i++)  {    printf(«Введите название %d книги : «, i + 1);    gets_s(libry.title);    printf(«Введите автора %d книги : «, i + 1);    gets_s(libry.author);    printf(«Введите цену %d книги : «, i + 1);    scanf_s(«%d», &libry.value);    getchar();  }  for (i = 0; i<3; i++)  {    printf(«\n %d. %s «, i + 1, libry.author);    printf(«%s %d», libry.title, libry.value);  }  getchar();  return 0;}

Результат выполнения

Заключение

Вот и весь функционал std::string. Большинство из этих функций имеют несколько разновидностей для обработки разных типов входных данных — об этом мы еще поговорим.

Хотя функционал достаточно широк, всё же есть несколько заметных упущений:

   поддержка регулярных выражений;

   конструкторы для создания строк из чисел;

   прописные/строчные функции;

   токенизация/разбиение строк на массивы;

   простые функции для получения левой или правой части строки;

   обрезка пробелов;

   конвертация из UTF-8 в UTF-16 и наоборот.

Всё вышеперечисленное вам придется реализовать самостоятельно, либо конвертировать вашу строку в строку C-style (используя функцию c_str()) и тогда уже использовать функционал, который предлагает язык C++.

Примечание: Хотя мы используем string в наших примерах, всё это также применимо и к wstring.

Ввод и вывод строк в С

Для ввода и вывода строковой информации можно использовать функции форматированного ввода и вывода (printf и scanf). Для этого в строке формата при вводе или выводе строковой переменной необходимо указать спецификатор типа %s. Например, ввод и последующий вывод строковой переменной будет иметь вид:

char str = «»; printf(«Введите строку: «); scanf(«%30s”,str); printf(«Вы ввели: %s”,str);

Недостатком функции scanf при вводе строковых данных является то, что символами разделителями данной функции являются:

  1. перевод строки,
  2. табуляция;
  3. пробел.

Поэтому, используя данную функцию невозможно ввести строку, содержащую несколько слов, разделенных пробелами или табуляциями. Например, если в предыдущей программе пользователь введет строку: «Сообщение из нескольких слов», то на экране будет выведено только «Сообщение». Для ввода и вывода строк в библиотеке stdio.h содержатся специализированные функции gets и puts.

Функция gets предназначена для ввода строк и имеет следующий заголовок:char * gets(char *buffer);

Между тем использовать функцию gets категорически не рекомендуется, ввиду того, что она не контролирует выход за границу строки, что может произвести к ошибкам. Вместо нее используется функция fgets с тремя параметрами:

char * fgets(char * buffer, int size, FILE * stream);

где buffer — строка для записи результата, size — максимальное количество байт, которое запишет функция fgets, stream — файловый объект для чтения данных, для чтения с клавиатуры нужно указать stdin. Эта функция читает символы со стандартного ввода, пока не считает n — 1 символ или символ конца строки, потом запишет считанные символы в строку и добавит нулевой символ. При этом функция fgets записывает в том символ конца строки в данную строку, что нужно учитывать.

Функция puts предназначена для вывода строк и имеет следующий заголовок:int puts(const char *string);

Простейшая программа: ввод и вывод строки с использованием функций fgets и puts будет иметь вид:

char str = «»; printf(«Введите строку: «);fgets(str, 102, stdin); printf(«Вы ввели: «); puts(str);

Для считывания одного символа можно использовать функцию fgetc(FILE * stream). Она считывает один символ и возвращает значение этого символа, преобразованное к типу int, если же считывание не удалось, то возвращается специальная константа EOF, равная -1. Функция возвращает значение -1 для того, чтобы можно было обрабатывать ситуацию конца файла, посимвольное чтение до конца файла можно реализовать следующим образом:

int c;while ((c = fgetc(stdin)) != EOF) {    // Обработка символа}

Для вывода одного символа можно использовать функцию  int fputc(int c, FILE *stream);.

Помимо функций ввода и вывода в потоки в библиотеке stdio.h присутствуют функции форматированного ввода и вывода в строки. Функция форматированного ввода из строки имеет следующий заголовок:

int sscanf(const char * restrict buffer, const char * restrict string, …); 

Функции форматированного вывода в строку имеют следующие заголовки:

int sprintf(char * restrict buffer, const char * restrict format, …); int snprintf(char * restrict buffer, size_t maxsize, const char * restrict format, …);

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

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

Adblock
detector