Разбор строк

Базовые разбор строк часто можно выполнить комбинацией методов '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 работает до первого пробела.

Подробное описание форматов 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 == ['Если', 'я', 'чешу', 'в', 'затылке', 'не', 'беда!']