Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
develop:pyton:digit [2022/01/23 06:21] admin |
develop:pyton:digit [2022/12/01 06:42] (текущий) admin |
||
---|---|---|---|
Строка 59: | Строка 59: | ||
===== Строки и двоичные данные ===== | ===== Строки и двоичные данные ===== | ||
+ | Длинна строки ограничивается лишь объемом ОЗУ\\ | ||
+ | Как и все последовательности поддерживает обращение по индексу, | ||
+ | **Неизменяемый** тип данных т.е. методы **возвращают новую строку**, | ||
+ | **Нулевой символ не является концом строки**\\ | ||
+ | * **str** - Unicode строка, | ||
+ | * **bytes** - неизменяемая последовательность байт, элементы хранят значения 0..255, поддерживает большинство методов строк, доступ по индексу возвращает целое число, а не символ. Может содержать как однобайтовые так и многобайтовые символы | ||
+ | * **bytearray** - изменяемая последовательность байт | ||
==== Создание строки ==== | ==== Создание строки ==== | ||
- | + | Если преобразовывать из bytes/ | |
- | + | **Разницы между двойными кавычками и апострофами нет**\\ | |
- | <code python> | + | Спец символы экранируются слешем либо символом **r** перед строкой\\ |
- | </ | + | **Тройные кавычки** (апострофы) сохраняют все форматирование, |
- | + | **Конкатенация** может происходить слешем, | |
- | <code python> | + | |
- | </ | + | |
==== Спец символы ==== | ==== Спец символы ==== | ||
+ | Типа: n, | ||
+ | Пишутся после слеша с-но\\ | ||
- | <code python> | + | ==== Операции над строками ==== |
- | </ | + | Обращение по индексу, |
+ | В индексе можно указать **отрицательное значение**, | ||
+ | Полезен метод **извлечения среза**, | ||
<code python> | <code python> | ||
+ | [< | ||
+ | s= Python | ||
+ | s[:] # вся строка | ||
+ | s[::-1] # в обратном порядке | ||
+ | " | ||
+ | s[:-1] # удалить последний символ | ||
+ | s[0:1]; s[-1:] # получить первый (последний) | ||
+ | s[2:5] # часть строки | ||
</ | </ | ||
- | ==== Операции над строками ==== | + | ==== Форматирование строк ==== |
+ | <code python> | ||
+ | < | ||
+ | %[(< | ||
+ | "%s - %s - %s" % (10,20,30) # '10 - 20 - 30' | ||
- | <code python> | + | # <Ключ> - ключ словаря, |
- | </ | + | " |
- | <code python> | + | # <Флаг> - флаг преобразования (пробелы, |
+ | # < | ||
</ | </ | ||
- | ==== Форматирование строк ==== | ||
+ | === Метод format() === | ||
+ | В последующих версиях python знак **%** перестанет использоваться, | ||
<code python> | <code python> | ||
- | </code> | + | <Строка> = < |
+ | {[< | ||
- | <code python> | + | "{0} - {1} - {2}" |
</ | </ | ||
- | === Форматируемые строки === | ||
+ | ==== Форматируемые строки ==== | ||
+ | В python 3.6 есть альтернатива методу **format()**, | ||
<code python> | <code python> | ||
- | </code> | + | {[<Переменная>] [!< |
- | <code python> | + | a= 10; b= 12.3; s= " |
+ | f"{a} - {b} - {s}" | ||
+ | |||
+ | # Еще вариант вставки переменных в строку | ||
+ | print(" | ||
</ | </ | ||
+ | |||
==== Функции и методы строк ==== | ==== Функции и методы строк ==== | ||
+ | * **strip()** - удаляет указанные символы в начале и конце строки (если не указано то пробелы удаляет) | ||
+ | * **l[r]strip()** - тоже самое только вначале (в конце) строки | ||
+ | * **split(< | ||
+ | * **rsplit()** - справа на лево | ||
+ | * **splitlines(< | ||
+ | * **join()** - собирает строку "< | ||
<code python> | <code python> | ||
+ | " => " | ||
</ | </ | ||
- | <code python> | ||
- | </ | ||
==== Локаль ==== | ==== Локаль ==== | ||
+ | **locate(< | ||
+ | Модуль **locale**, устанавливать несколько раз.\\ | ||
+ | Установить можно командой **locate.setlocate(< | ||
+ | * **locate.LC_ALL** - для всех режимов | ||
+ | * **locate.LC_COLLATE** - для сравнения строк | ||
+ | * **locate.LC_CTYPE** - для перевода регистра | ||
+ | * **locate.LC_MONETARY** - для денежных единиц | ||
+ | * **locate.LC_NUMERIC** - для чисел | ||
+ | * **locate.LC_TIME** - для даты/ | ||
- | |||
- | <code python> | ||
- | </ | ||
- | |||
- | <code python> | ||
- | </ | ||
==== Регистр символов ==== | ==== Регистр символов ==== | ||
+ | **upper(), lower(), swapcase(), capitalize(), | ||
- | |||
- | <code python> | ||
- | </ | ||
- | |||
- | <code python> | ||
- | </ | ||
==== Функции и методы символов ==== | ==== Функции и методы символов ==== | ||
+ | **chr(), ord()**- возвращает символ указанного кода, и код указанного символа\\ | ||
- | <code python> | ||
- | </ | ||
- | <code python> | + | ==== Поиск и замена ==== |
- | </code> | + | * **find()** - возвращает номер позиции с которой начинается подстрока или -1 если ее нет, **чувствителен к регистру**. |
+ | * **index()** - аналогично, | ||
+ | * **rfind()/rindex()** - аналогично но возвращает номер последнего вхождения | ||
+ | * **count()** - кол-во вхождений | ||
+ | * **startswith()/ | ||
+ | * **replace()** - возвращает новую строку. < | ||
+ | * **translate(< | ||
- | ==== Поиск и замена ==== | ||
+ | ==== Проверка типа содержимого строки ==== | ||
+ | Есть рад функций типа **isalnum()**, | ||
- | <code python> | ||
- | </ | ||
- | <code python> | ||
- | </ | ||
+ | ==== bytes ==== | ||
+ | Хранит в себе неизменяемую последовательность байт, от 0..255, можно хранить бинарные данные, | ||
- | ==== Проверка типа ==== | + | **bytearray**- впринципе тоже самое, но последовательность |
- | <code python> | ||
- | </ | ||
- | <code python> | + | ==== Преобразование ==== |
- | </code> | + | Преобразовать объект в последовательность байтов (т.е. выполнить сериализацию/ |
+ | * **dump(<Объект>, < | ||
+ | * **load(<последовательность байт>, | ||
- | ==== bytes ==== | ||
+ | ==== Шифрование ==== | ||
+ | Модуль **hashlib**\\ | ||
+ | Функции типа **md5()**, **sha1, | ||
- | <code python> | ||
- | </ | ||
- | <code python> | ||
- | </ | ||
+ | ===== Регулярные выражения ===== | ||
+ | **import re**\\ | ||
+ | [[https:// | ||
- | ==== bytearray ==== | ||
+ | ==== Синтаксис ==== | ||
+ | Шаблон нужно компилировать ф-ей **compile()**\\ | ||
+ | :!: Символ **r** перед строкой позволяет не экранировать спец символы\\ | ||
<code python> | <code python> | ||
- | </code> | + | <Шаблон>= re.compile(< |
- | <code python> | + | p= re.compile(r" |
- | </ | + | if p.search(" |
+ | # Либо | ||
+ | if re.search(" | ||
- | ==== Преобразование ==== | + | </ |
+ | Модификаторы: | ||
+ | * **I (IGNORECASE)** - регистр | ||
+ | * **M (MULTILINE)** - текст с подстроками, | ||
+ | * **S (DOTALL)** - если указать, | ||
+ | * **X (VERBOSE)** - пробелы и перевод строки игнорируется | ||
+ | Экранирование слешем (\) или в квадратных скобках | ||
<code python> | <code python> | ||
+ | re.compile(r" | ||
+ | re.compile(r" | ||
</ | </ | ||
+ | Символы ^ и $ зависят от модификаторов (M или S), \A и \Z- аналогичные, | ||
<code python> | <code python> | ||
- | </ | + | p= re.compile(r" |
+ | p.findall(" | ||
+ | p= re.compile(r" | ||
+ | p.findall(" | ||
- | ==== Шифрование | + | p= re.compile(r" |
+ | p.findall(" | ||
- | <code python> | + | p= re.compile(r" |
- | </ | + | p.search(" |
- | <code python> | + | # Позиция для поиска |
+ | p= re.compile(r" | ||
+ | p.search(" | ||
+ | |||
+ | p= re.compile(r" | ||
+ | p.search(" | ||
</ | </ | ||
+ | Вместо символов можно использовать классы: | ||
+ | * **\d** - цифры | ||
+ | * **\w** - цифры и буква | ||
+ | * **\s** - любой пробельный символ | ||
+ | * **\D, \W, \S** - тоже самое, ток отрицание | ||
+ | * **\b** - начало слова | ||
+ | * **\B** - не начало слова | ||
- | ===== Регулярные выражения ===== | + | Число вхождений, |
+ | * **{n}, {n,}, {n,m}** - ровно **n**, **n** и более, от **n** до **m** | ||
+ | * ***** - ноль | ||
+ | * **+** - одно или более | ||
+ | * **?** - ни одного | ||
+ | Ищется самая длинная строка, | ||
+ | Получить содержимое тегов '< | ||
+ | <code python> | ||
+ | s= '< | ||
+ | p= re.compile(r"< | ||
+ | p.findall(s) | ||
+ | >> ['< | ||
- | ==== Синтаксис ==== | + | p= re.compile(r"< |
+ | p.findall(s) | ||
+ | >> ['< | ||
- | + | p= re.compile(r" | |
- | <code python> | + | p.findall(s) |
+ | >> [' | ||
</ | </ | ||
- | <code python> | ||
- | </ | ||
- | + | Скобки **группируют фрагменты**, чтобы отбросить из результата сами фрагменты, нужно указать **?:** внутри | |
- | ==== Поиск первого совпадения ==== | + | Например (?:tx) найдет и " |
+ | К найденному фрагменту можно обратится, | ||
+ | Например получим текст между одинаковыми тегами: | ||
<code python> | <code python> | ||
- | </code> | + | s= '< |
+ | p= re.compile(r"< | ||
+ | p.findall(s) | ||
+ | >> [(' | ||
- | <code python> | + | # ?P<name> - для задания имени фрагменту |
+ | s= 'eed 34 dc 3455' | ||
+ | p= re.compile(r" | ||
+ | p.search(s) | ||
+ | p.group(' | ||
+ | >> ' | ||
</ | </ | ||
- | ==== Поиск всех | + | ==== Поиск |
+ | Для этого есть следующе методы (и функции их аналоги): | ||
+ | * **match()** - соответствие с началом строки | ||
+ | * **search()** - соответствие с любой частью строки | ||
+ | * **fullmatch()** - соответствие со всей строкой | ||
+ | |||
+ | Объект **Match** содержит следующие свойства и методы: | ||
+ | * **re** - ссылка на скомпилированный шаблон, | ||
+ | * **groups (groupindex)** - кол-во групп в шаблоне (перечисление в словаре) | ||
+ | * **pattern** - строка с рег выражением | ||
+ | * **flags** - комбинация флагов | ||
+ | * **string** - строка .. оО | ||
+ | * **pos (endpos)** - начальная/ | ||
+ | * **lastindex (lastgroup)** - пар-ры последней группы | ||
+ | * **group (groups, groupdict)** - фрагменты, | ||
+ | * **start (end)** - начало/ | ||
+ | * **span** - кортеж с начальным и конечным индексами фрагмента | ||
+ | * **expand** - замена в строке | ||
- | <code python> | + | ==== Поиск всех совпадений ==== |
- | </ | + | Это так же функции и методы: |
- | + | * **findall()** - возвращает список (строк или кортежей), | |
- | <code python> | + | * **finditer()** - возвращает итератор, |
- | </ | + | |
==== Замена в строке ==== | ==== Замена в строке ==== | ||
+ | Метод **sub()** ищет все совпадения и заменяет указанным значением\\ | ||
+ | sub[< | ||
+ | Внутри нового фрагмента можно использовать **обратные ссылки** типа (\номер элемента \g название группы \g номер группы)\\ | ||
<code python> | <code python> | ||
- | </code> | + | # Поменяем два тега местами |
+ | p= re.compile(r" | ||
+ | print(p.sub(r"< | ||
+ | print(p.sub(r"< | ||
+ | print(p.sub(r"< | ||
- | <code python> | + | # Функция для замены |
- | </ | + | def repl(match): |
+ | x= int(match.group(0)) | ||
+ | x += 10 | ||
+ | return " | ||
- | + | p= re.compile(r" | |
- | ==== Функции и методы ==== | + | print(p.sub(repl, |
- | + | ||
- | + | ||
- | <code python> | + | |
</ | </ | ||
- | <code python> | ||
- | </ | ||
+ | ==== Прочие функции и методы ==== | ||
+ | * **split()** - разбивка строки | ||
+ | * **escape()** - экранирует все символы (re.escape(r" | ||
+ | * **purge()** - очистка кэша рег выражений | ||