===== Разбор строк ===== Базовые разбор строк часто можно выполнить комбинацией методов 'split', 'strip' и приведением полученных элементов строки к нужным типам. Но иногда этого бывает мало или получаемый код выходит слишком громоздким. ==== scanf ==== Пакет ''scanf''[pip] предоставляет метод разбора строк аналогичный C функции ''scanf''. from scanf import scanf template = 'Power: %f [%], %s, Stemp: %f' text = 'Power: 0.0 [%], Cool, Stemp: 23.73' s = scanf(template, text) #s == (0.0, 'Cool', 23.73) ^ Шаблон ^ Значение ^ | ''%c'' | Один символ | | ''%5c'' | Пять символов | | ''%d'', ''%i'' | Целое число | | ''%7d'', ''%7i'' | Целое число в 7 символов | | ''%f'' | Число с плавающей запятой | | ''%X'', ''%x'' | Целое число в шестнадцатеричной системе | | ''%s'' | Строка до первого пробела | Поддерживаемые модификаторы: ширина поля ''%12d'' и пропуск поля ''%*d''. Дополнительно имеется тип ''%c'' — один или нескольких символов, например ''%12c'', а ''%s'' работает до первого пробела. Подробное описание форматов [[https://github.com/joshburnett/scanf|scanf]].
==== Регулярные выражения ==== Регулярные выражения — специальный язык программирования. В стандартной библиотеке Python есть модуль для работы с ними — ''re''. Перед использованием регулярные выражения следует компилировать методом ''re.compile'', это повышает производительность. Основные применения: * Проверка формальной корректности строки * Поиск/замена по шаблону * Разделение строки по правилам Проверить свои регулярные выражения можно, например, на сайте [[http://www.pyregex.com/]]. Использование длинных и сложных регулярных выражений считается плохим стилем. Для разбора сложного синтаксиса следует использовать другие инструменты.
=== Некоторые популярные регулярные выражения === ^ Выражение ^ Смысл ^ | ''^'' | Начало строки | | ''$'' | Конец строки | | ''.'' | Один любой символ | | ''[abcd]'' | Один из символов ''abcd'' | | ''[a-z0-9A-Z]'' | Один из алфовитноцифровых символов | | ''\w'' | Один символ из набора ''[a-zA-Z0-9_]'' + Unicode letters | | ''\s'' | Один пробельный символ | | ''( )'' | Группа из одного или нескольких шаблонов к которой можно обращаться | | ''+'' | Модификатор "один или несколько" | | ''*'' | Модификатор "ноль или несколько" | Чтобы избежать проблем с экранированием регулярные выражения записываются, как строки без экранирования, например ''r'\w+'''.
==== Некоторые методы ==== === match === Проверка на соответствие строки — шаблону. import re r = re.compile(r"\w+ = \w+") r.match("Привет = мир") != None # True r.match("Привет =") != None # False r.match("Привет = мир проверка") != None # True r = re.compile(r"^\w+\s+=\s+\w+$") r.match("Привет = мир проверка") != None # False r.match("Привет = мир\n") != None # True r = re.compile(r"^(\w+)\s+=\s+(\w+)$") wd = r.match("Привет = мир") wd.group(0) # 'Привет = мир' wd.group(1) # 'Привет' wd.group(2) # 'мир'
=== search / findall === Поиск в строке подстрок(-и) удовлетворяющей выражению. import re r = re.compile(r"[а-я]+") wd = r.search("Если я чешу в затылке не беда!") s = wd.group(0) # s == 'сли' t = r.findall("Если я чешу в затылке не беда!") #t == ['сли', 'я', 'чешу', 'в', 'затылке', 'не', 'беда']
=== sub === Замена подстрок(-и) удовлетворяющей выражению. import re r = re.compile(r"\s+") s = r.sub("-","begin begin begin end end end") # s == 'begin-begin-begin-end-end-end'
=== split === Разбиение строки по разделителю в виде регулярного выражения. import re r = re.compile(r"\s+") s = r.split("Если я чешу в затылке не беда!") # s == ['Если', 'я', 'чешу', 'в', 'затылке', 'не', 'беда!']