Инструменты пользователя

Инструменты сайта


develop:pyton:digit

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:pyton:digit [2022/01/23 08:04]
admin
develop:pyton:digit [2022/12/01 06:42] (текущий)
admin
Строка 99: Строка 99:
  
 ==== Форматирование строк ==== ==== Форматирование строк ====
 +<code python>
 +<Строка специального формата> % <Значение>
 +%[(<Ключ>)] [<Флаг>] [<Ширина>] [.<Точность>] <Тип преобразования>
  
 +"%s - %s - %s" % (10,20,30) # '10 - 20 - 30'
  
-<code python+<Ключ- ключ словаря, в этом случае должен быть указан словарь 
-</code>+"%(name)s - %(year)s" % {"year": 1978, "name": "Nil"}
  
-<code python>+<Флаг- флаг преобразования (пробелы, нули, системы счисления) 
 +# <Ширина> - мин ширина поля
 </code> </code>
  
  
-=== Форматируемые строки === 
  
 +=== Метод format() ===
 +В последующих версиях python знак **%** перестанет использоваться, рекомендуется использовать этот метод
  
 <code python> <code python>
-</code>+<Строка= <Строка спец формата>.format(*args, **kwargs) 
 +{[<Поле>] [!<Функция>] [:<Формат>]} 
  
-<code python>+"{0} - {1} - {2}".format(10, 12.3, "String") # '10 - 12.3 String'
 </code> </code>
  
  
-==== Функции и методы строк ==== 
  
 +==== Форматируемые строки ====
 +В python 3.6 есть альтернатива методу **format()**, т.н. "Форматируемая строка", она обязательно предваряется символом **f (F)**, и вставляет переменные у казанные места.. типа того
  
 <code python> <code python>
-</code>+{[<Переменная>] [!<Функция>] [:<Формат>]}  
 + 
 +a= 10; b= 12.3; s= "string" 
 +f"{a} - {b} - {s}"
  
-<code python>+# Еще вариант вставки переменных в строку 
 +print("{0} - {1}".format(1, 2))
 </code> </code>
  
  
-==== Локаль ==== 
  
 +==== Функции и методы строк ====
 +  * **strip()** - удаляет указанные символы в начале и конце строки (если не указано то пробелы удаляет)
 +  * **l[r]strip()** - тоже самое только вначале (в конце) строки
 +  * **split(<Разделитель>=пробел, <Лимит>= )** - разбивает на подстроки
 +  * **rsplit()** - справа на лево
 +  * **splitlines(<False>- не включать разделить в результат)** - разбивает по строкам (символ переноса строки)
 +  * **join()** - собирает строку "<строка> = <разделитель>.join(<последовательность>)" - :!: п*дарастическая ф-я, непонятки с кодировкой после нее
  
 <code python> <code python>
 +" => ".join(["one", "two", "three"]) # 'one => two => three'
 </code> </code>
  
-<code python> 
-</code> 
  
  
-==== Регистр символов ====+==== Локаль ==== 
 +**locate(<категория>, <локаль>= )**\\ 
 +Модуль **locale**, устанавливать несколько раз.\\ 
 +Установить можно командой **locate.setlocate(<Категория>)**, получить текущую **locate.getlocate(<Категория>)**, получить настройки локали можно **locate.localeconv()**\\ 
 +  * **locate.LC_ALL** - для всех режимов 
 +  * **locate.LC_COLLATE** - для сравнения строк 
 +  * **locate.LC_CTYPE** - для перевода регистра 
 +  * **locate.LC_MONETARY** - для денежных единиц 
 +  * **locate.LC_NUMERIC** - для чисел 
 +  * **locate.LC_TIME** -  для даты/время
  
  
-<code python> 
-</code> 
  
-<code python> +==== Регистр символов ==== 
-</code>+**upper(), lower(), swapcase(), capitalize(), title(), casefold()**- верхний/нижний/противоположный регистры, первая буква заглавная, тоже но для каждого слова, заменяет расширенные символы буквами, полезно при сравнении строк.\\ 
  
  
 ==== Функции и методы символов ==== ==== Функции и методы символов ====
 +**chr(), ord()**- возвращает символ указанного кода, и код указанного символа\\
  
  
-<code python> 
-</code> 
  
-<code python> +==== Поиск и замена ==== 
-</code>+  * **find()** - возвращает номер позиции с которой начинается подстрока или -1 если ее нет, **чувствителен к регистру**. <строка>.find(<подстрока>, <начало>=, <конец>= ), если начало и конец указаны, поиск производится в срезе 
 +  * **index()** - аналогично, но вызовет исключение если подстроки нет 
 +  * **rfind()/rindex()** - аналогично но возвращает номер последнего вхождения 
 +  * **count()** - кол-во вхождений 
 +  * **startswith()/endswith()** - начинается (заканчивается) ли строка с указанной подстроки 
 +  * **replace()** - возвращает новую строку. <строка>.replace(<подстрока>, <новая подстрока>, <мах кол-во замены>= ) 
 +  * **translate(<таблица символов>)** - в аргументе принимает словарь, собсна заменяет все указанные символы соответствующими, "None"- удаляет. В ключе словаря должен быть указано Unicode номер символа, с этим может помочь метод **maketrans(dict)**. Для удаления можно указать целую строку символов, третьим параметром
  
  
-==== Поиск и замена ==== 
  
 +==== Проверка типа содержимого строки ====
 +Есть рад функций типа **isalnum()**, **isalpha()**, **isdigit()**, **isdecimal()**, **isnumeric()**, **isupper()**, **istitle()** и т.д., для проверки содержимого\\
  
-<code python> 
-</code> 
  
-<code python> 
-</code> 
  
 +==== bytes ====
 +Хранит в себе неизменяемую последовательность байт, от 0..255, можно хранить бинарные данные, поддерживает множество строковых методов\\
  
-==== Проверка типа ====+**bytearray**- впринципе тоже самое, но последовательность изменяемая\\
  
  
-<code python> 
-</code> 
  
-<code python+==== Преобразование ==== 
-</code>+Преобразовать объект в последовательность байтов (т.е. выполнить сериализацию/десериализацию) можно с помощью **модуля pickle**\\ 
 +  * **dump(<Объект>, <протокол>=, <fix_imports>=True)** - возвращает последовательность байт, в соответствии с протоколом 
 +  * **load(<последовательность байт>, <fix_imports>=True, <encoding>=ASCII, <errors>)** -  обратное д-е
  
  
-==== bytes ==== 
  
 +==== Шифрование ====
 +Модуль **hashlib**\\
 +Функции типа **md5()**, **sha1,224,256,384()**, в 3.6 появились еще **sha3_224,256,512()** и т.д.
  
-<code python> 
-</code> 
  
-<code python> 
-</code> 
  
 +===== Регулярные выражения =====
 +**import re**\\
 +[[https://python.ivan-shamaev.ru/python-3-regular-expressions-regex-match-group-string|Дока]]\\
  
-==== bytearray ==== 
  
 +==== Синтаксис ====
 +Шаблон нужно компилировать ф-ей **compile()**\\
 +:!: Символ **r** перед строкой позволяет не экранировать спец символы\\
  
 <code python> <code python>
-</code>+<Шаблон>= re.compile(<Рег выражение>, <Модификатор>=)
  
-<code python> +p= re.compile(r"^[а-я]+$") 
-</code>+if p.search("Input string"):
  
 +# Либо
 +if re.search("^[а-я]+$", "Input string"):
  
-==== Преобразование ====+</code>
  
 +Модификаторы:
 +  * **I (IGNORECASE)** - регистр
 +  * **M (MULTILINE)** - текст с подстроками, символы ^ и $ относятся к подстрокам
 +  * **S (DOTALL)** - если указать, то символ точка соответсвует переводу стоки.. оО
 +  * **X (VERBOSE)** - пробелы и перевод строки игнорируется
  
 +Экранирование слешем (\) или в квадратных скобках
 <code python> <code python>
 +re.compile(r"^[0-3][0-9]\.[01][0-9]\.[12]$")
 +re.compile(r"^[0-3][0-9][.][01][0-9][.][12]$")
 </code> </code>
  
 +Символы ^ и $ зависят от модификаторов (M или S), \A и \Z- аналогичные, но не зависят от модификаторов\\
 <code python> <code python>
-</code>+p= re.compile(r"^.+$") Точка не соответствует \n 
 +p.findall("Str1\nStr2\nStr3") # Ничего не найдено
  
 +p= re.compile(r"^.+$", re.S) # Теперь соответствует
 +p.findall("Str1\nStr2\nStr3") # Найдена все строка, целиком
  
-==== Шифрование ====+pre.compile(r"^.+$", re.M) # Многострочный режим 
 +p.findall("Str1\nStr2\nStr3") # list из трех подстрок
  
  
-<code python> +p= re.compile(r"Красн((ая)|(ое))") 
-</code>+p.search("Красное")
  
-<code python>+# Позиция для поиска 
 +p= re.compile(r"\bPython\b"
 +p.search("Python"
 + 
 +p= re.compile(r"\Bthon\b"
 +p.search("Python")
 </code> </code>
  
 +Вместо символов можно использовать классы:
 +  * **\d** - цифры
 +  * **\w** - цифры и буква
 +  * **\s** - любой пробельный символ
 +  * **\D, \W, \S** - тоже самое, ток отрицание
 +  * **\b** - начало слова
 +  * **\B** - не начало слова
  
-===== Регулярные выражения =====+Число вхождений, типа:  
 +  * **{n}, {n,}, {n,m}** - ровно **n**, **n** и более, от **n** до **m** 
 +  * ***** - ноль или более 
 +  * **+** - одно или более 
 +  * **?** - ни одного
  
 +Ищется самая длинная строка, пропуская более короткие соответствия, чтобы ограничить, нужно указать ?\\
 +Получить содержимое тегов '<br>' вместе с тегами:
 +<code python>
 +s= '<br>Text1</br>Text2<br>Text3</br>'
 +p= re.compile(r"<br>.*</br>", re.S)
 +p.findall(s)
 +>> ['<br>Text1</br>Text2<br>Text3</br>'] # Получили всю строку
  
-==== Синтаксис ====+pre.compile(r"<br>.*?</br>", re.S) # Ограничили "Жадность" 
 +p.findall(s) 
 +>> ['<br>Text1</br>', '<br>Text3</br>'
  
- +p= re.compile(r"<br>(.*?)</br>", re.S) # Добавили скобки 
-<code python>+p.findall(s) 
 +>['Text1', 'Text3'] # Результат без тегов !!!
 </code> </code>
  
-<code python> 
-</code> 
  
- +Скобки **группируют фрагменты**, чтобы отбросить из результата сами фрагменты, нужно указать **?:** внутри скобок\\ 
-==== Поиск первого совпадения ====+Например (?:tx) найдет и "Text" и "tx", чтобы второго не было, нужно указать **?:**\\
  
  
 +К найденному фрагменту можно обратится, по порядковому номеру или по имени, номера есть по умолчанию- **\№**\\
 +Например получим текст между одинаковыми тегами:
 <code python> <code python>
-</code>+s= '<b>Text1</b> Text4 <I>Text2</I> <b>Text3</b>' 
 +p= re.compile(r"<([a-z]+)>(.*?)</\1>", re.S | re.I) 
 +p.findall(s) 
 +>[('b', 'Text1'), ('I', 'Text2'), ('b', 'Text3')]
  
-<code python>+# ?P<name- для задания имени фрагменту 
 +s= 'eed 34 dc 3455' 
 +p= re.compile(r"(?P<digits>[0-9]+) (?P<simb>[a-z]+)", re.I) 
 +p.search(s) 
 +p.group('digit'
 +>> '34' # Пока точно не уверен на чет результата, нужно больше углубления
 </code> </code>
  
  
-==== Поиск всех совпадений ====+==== Поиск первого совпадения ==== 
 +Для этого есть следующе методы (и функции их аналоги): 
 +  * **match()** - соответствие с началом строки 
 +  * **search()** - соответствие с любой частью строки 
 +  * **fullmatch()** - соответствие со всей строкой 
 +   
 +Объект **Match** содержит следующие свойства и методы:   
 +  * **re** - ссылка на скомпилированный шаблон, в ней есть следующие атрибуты: 
 +      * **groups (groupindex)** -  кол-во групп в шаблоне (перечисление в словаре) 
 +      * **pattern** - строка с рег выражением 
 +      * **flags** -  комбинация флагов 
 +  * **string** - строка .. оО 
 +  * **pos (endpos)** - начальная/конечная позиции 
 +  * **lastindex (lastgroup)** - пар-ры последней группы 
 +  * **group (groups, groupdict)** - фрагменты, соответствующие шаблону 
 +  * **start (end)** - начало/окончание фрагмента 
 +  * **span** - кортеж с начальным и конечным индексами фрагмента 
 +  * **expand** - замена в строке
  
  
-<code python> +==== Поиск всех совпадений ==== 
-</code> +Это так же функции и методы: 
- +  * **findall()** - возвращает список (строк или кортежей), ищет все соответствия 
-<code python> +  * **finditer()** - возвращает итератор, на каждой итерации возвращает **Match**
-</code>+
  
  
 ==== Замена в строке ==== ==== Замена в строке ====
 +Метод **sub()** ищет все совпадения и заменяет указанным значением\\
 +  sub[<Новый фрагмент или ссылка на функцию>, <Строка для замены>, <Мах кол-во замен>=]
  
 +Внутри нового фрагмента можно использовать **обратные ссылки** типа (\номер элемента \g название группы \g номер группы)\\
 <code python> <code python>
-</code>+# Поменяем два тега местами 
 +p= re.compile(r"<(?P<tag1>[a-z]+)><(?P<tag2>[a-z]+)>"
 +print(p.sub(r"<\2><\1>", "<br><hr>")) 
 +print(p.sub(r"<\g<2>><\g<1>>", "<br><hr>")) 
 +print(p.sub(r"<\g<tag2>><\g<tag1>>", "<br><hr>"))
  
-<code python> +# Функция для замены 
-</code>+def repl(match): 
 +        x= int(match.group(0)) 
 +        x += 10 
 +        return "{0}".format(x)
  
- +pre.compile(r"[0-9]+") 
-==== Функции и методы ==== +print(p.sub(repl, "2008, 2009, 2010, 2011"))
- +
- +
-<code python>+
 </code> </code>
  
-<code python> 
-</code> 
  
 +==== Прочие функции и методы ====
 +  * **split()** - разбивка строки 
 +  * **escape()** - экранирует все символы (re.escape(r"[]{}."))
 +  * **purge()** - очистка кэша рег выражений
  
develop/pyton/digit.1642925053.txt.gz · Последнее изменение: 2022/01/23 08:04 — admin