Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Язык программирования высокого уровня Python. Функции, структуры данных, дополнительные модули. Учебное пособие
.pdf
8. Язык регулярных выражений
Жадный
Ленивый
*
*? + +?
{n,}
{n,}?
Использование ленивых квантификаторов может повлечь за собой
обратную проблему, когда выражению соответствует слишком короткая,
в частности, пустая строка.
Ревнивая квантификация (Сверхжадная)
При поиске выражения (a+a+)+a в строке aaaaa интерпретатор пойдёт
приблизительно по следующему пути:
1. aaaaa
2. aaaa
3. aaaaa
4. aaa
5. aaaaa
6. aaaa
7. aaaaa и только тут, проверив все точки возврата, сдастся.
При использовании ревнивого квантификатора будет выполнен толь-
ко первый шаг алгоритма.
В отличие от обычной (жадной) квантификации, ревнивая
(possessive) квантификация не только старается найти максимально длинный вариант, но ещё и не позволяет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для
оставшейся части регулярного выражения.
Использование квантификаторов увеличивает скорость поиска, особенно в тех случаях, когда строка не соответствует регулярному выражению.
Кроме того, ревнивые квантификаторы могут быть использованы для
исключения нежелательных совпадений.
51

8. Язык регулярных выражений
Жадный
Ревнивый
*
*+
?
?+ + ++
{n,}
{n,}+
Метасимволы группы ()
Метасимволы для именования группы
(?P<Имя_группы> Регулярное_выражение)
Метасимволы группы
Группа подстрока, соответствующая регулярному выражению в
круглых скобках.
Круглые скобки используются также для определения области дей-
ствия и приоритета операций.
При обработке регулярного выражения подстроки, найденные по
шаблону внутри группы, сохраняются в отдельной области памяти и получают номер, начиная с единицы. Содержимое подстрок группы может
быть получено с помощью метода group() объектов класса MatchObject,
которые возвращаются операцией поиска совпадений.
К найденному фрагменту внутри скобок можно обратиться с помощью механизма обратных ссылок. Нумерация подстрок в группах начинается с 1. Для этого порядковый номер круглых скобок в шаблоне указывается после слэша, например, /1.
Группам можно давать имена. Для этого после открывающей круглой скобки необходимо указать комбинацию метасимволов
?P<Имя_группы>.
Чтобы внутри шаблона обратиться к именованным фрагментам, используется следующий синтаксис: (?P=Имя_группы).
Пример:
s = ”<b>Text1</b>Text2<I>Text3</I>”
52

8. Язык регулярных выражений
Синтаксис
Описание
(?#...)
Комментарий текст внутри скобок игнорируется
(?=...)
Положительный просмотр вперед. Пример: Вывести все слова, после
которых расположена запятая.
s = ”text1, text2, text3 text4”
p = re.compile(r”\w+(?=[,])”, re.S|re.I)
p.findall(s)
#Результат [’text1’, ’text2’]
(?!...)
Отрицательный просмотр вперед. Пример: Вывести все слова, после
которых не расположена запятая.
s = ”text1, text2, text3 text4”
p = re.compile(r”[a-z]+[0-9](?![,])”,
re.S|re.I)
p.findall(s)
#Результат [’text3’, ’text4’]
(?<=...)
Положительный просмотр назад. Пример: Вывести все слова, перед
которыми расположена запятая с пробелом.
s = ”text1, text2, text3 text4”
p = re.compile(r ”(?<=[,][ ])[a-z]+[0-9]”,
re.S|re.I)
p.findall(s)
#Результат [’text2’, ’text3’]
(?<!...)
Отрицательный просмотр назад. Пример: Вывести все слова, перед
которыми расположен пробел, но перед пробелом нет запятой.
s = ”text1, text2, text3 text4”
p = re.compile(r (?<![,]) ([a-z]+[0-9])”,
re.S|re.I)
p.findall(s)
#Результат [’text4’]
p = re.compile(r”<(?P<tag>[a-z]+)>(.*?)</(?P=tag)>”,
re.S|re.I)
p.findall(s)
#Результат [(’b’, ’Text1’), (’I’, ’Text3’)]
Просмотр вперед и назад
53

8. Язык регулярных выражений
Синтаксис
Описание
(?(id|name)
шаблон1|шаблон2)
Проверяет, существует ли группа с числовым
идентификатором id или с именем name. Если такая группа
существует, то выполняется условие из шаблона1, иначе из
шаблона2. Например, выражение r’(Hello)?(?(1) World|Howdy)’
совпадет со строкой ‘Hello World’ или со строкой ‘Howdy’.
(?#...)
Комментарий, текст внутри скобок игнорируется
Метасимволы [ ] \ / ^ $ . | ? * + ( ) { } < >
Метасимвол
Описание
.
Соответствует любому символу, кроме символа перевода
строки
^
Соответствует позиции начала строки
$
Соответствует позиции конца строки
*
Ноль или более повторений предшествующего выражения;
соответствует максимально возможному числу повторений
+
Одно или более повторений предшествующего выражения;
соответствует максимально возможному числу повторений
?
Ноль или одно повторение предшествующего выражения
*?
Ноль или одно повторение предшествующего выражения
+?
Одно или более повторений предшествующего выражения
??
Ноль или одно повторение предшествующего выражения;
соответствует минимально возможному числу повторений
{m}
Соответствует точно m повторениям предшествующего
выражения
{m, n}
Соответствует от m до n повторений предшествующего
выражения. Если аргумент m опущен, он принимается равным
0. Если аргумент n опущен, он принимается равным
бесконечности
Поиск по условию
Сводная таблица метасимволов
Ниже приводится список последовательностей специальных
символов, которые используются в шаблонах регулярных выражений:
54

8. Язык регулярных выражений
Метасимвол
Описание
{m, n}?
От m до n повторений предшествующего выражения;
соответствует минимально возможному числу повторений
[...]
Соответствует любому символу, присутствующему в
множестве, таком как r’[abcdef]’ или r’[a-zA-z]’. Специальные
символы, такие как *, утрачивают свое специальное значение
внутри множества
[^...]
Соответствует любому символу, не присутствующему в
множестве, таком как r’[^0-9]’
A|B
Соответствует либо A, либо B, где A и B являются регулярными
выражениями
(...)
Подстрока, соответствующая регулярному выражению в
круглых скобках, интерпретируется как группа и сохраняется.
Содержимое группы может быть получено с помощью метода
group() объектов класса MatchObject, которые возвращаются
операцией поиска совпадений
(?aiLmsux)
Символы “a”, “i”, “L”, “m”, “s”, “u” и “x” интерпретируются как
флаги, соответствующие флагам re.A, re.I, re.L, re.M, re.S, re.U,
re.X, которые передаются методу re.compile(). Флаг “a”
доступен только в Python 3
(?:..)
Соответствует регулярному выражению в круглых скобках, но
совпавшая подстрока не сохраняется
(?P<name>...)
Подстрока, соответствующая регулярному выражению в
круглых скобках, интерпретируется как именованная группа с
именем name. Имя группы должно быть допустимым
идентификатором Python
(?P=name...)
Соответствует тому тексту, который ранее уже совпал с
именованной группой name
(?#...)
Комментарий. Содержимое в круглых скобках игнорируется
(?=...)
Соответствует предшествующему выражению, только если
вслед за ним обнаруживается совпадение с шаблоном в
круглых скобках. Например, выражение r’Hello (?=World)’
совпадет с подстрокой ‘Hello ‘, только если за ней будет
следовать подстрока ‘World’
55

8. Язык регулярных выражений
Метасимвол
Описание
(?!...)
Соответствует предшествующему выражению, только если
вслед за ним отсутствует совпадение с шаблоном в круглых
скобках. Например, выражение r’Hello (?!World)’ совпадет с
подстрокой ‘Hello ‘ , только если за ней не будет следовать
подстрока ‘World’
(?<=...)
Соответствует следующему выражению, только если перед
ним обнаруживается совпадение с шаблоном в круглых
скобках. Например, выражение r’(?<=abc)def’ совпадет с
подстрокой ‘def’, только если ей будет предшествовать
подстрока ‘abc’
(?<!...)
Соответствует следующему выражению, только если перед
ним отсутствует совпадение с шаблоном в круглых скобках.
Например, выражение r’(?<!abc)def’ совпадет с подстрокой
‘def’, только если ей не будет предшествовать подстрока ‘abc’
(?(id|name)
шаблон1/ша
блон2)
Проверяет, существует ли группа регулярного выражения с
числовым идентификатором id или с именем name. Если такая
группа существует, определяется соответствие регулярному
выражению ypat. В противном случае определяется
соответствие необязательному регулярному выражению npat.
Например, выражение r’(Hello)?(?(1) World|Howdy)’ совпадет со
строкой ‘Hello World’ или со строкой ‘Howdy’
56

9. МОДУЛЬ RE
Модуль re предоставляет интерфейс для работы с регулярными выражениями, что позволяет компилировать регулярные выражения в объекты, а затем выполнять сопоставления и замены в соответствии с шаблонами.
Методы для выполнения операций сопоставления
с шаблоном и замены
1. compile()
Создать откомпилированный шаблон регулярного выражения
позволяет метод compile(). При этом создается объект регулярного
выражения. Данный объект также предоставляет ряд методов.
Формат метода:
Шаблон = re.compile( Регулярное выражение [,флаг-
модификатор])
Пример:
p = re.compile(r”^.$”, re.M)
Перед всеми строками, содержащими регулярные выражения,
указывается модификатор r. Если модификатор не указать, то все слэши
необходимо будет экранировать.
Например строку
p = re.compile(r”^\w+$”)
нужно было бы записать так:
p = re.compile(”^\\w+$”)
В параметре флаг-модификатор могут быть указаны следующие
флаги или их комбинация через оператор | :
57

9. Модуль re
№
Флаги
Описание
1
L или LOCALE
При сопоставлении со специальными символами
\w, \W, \b и \B используются региональные
настройки
2
I или IGNORECASE
Сопоставление выполняется без учета регистра
символов
3
M или MULTILINE
Обеспечивает совпадение символов ^ и $ с
началом и концом каждой строки в тексте,
помимо начала и конца самого текста (обычно
символы ^ и $ совпадают только с началом и
концом всего текста)
4
S или DOTALL
Обеспечивает совпадение символа точки (.) со
всеми символами, включая символ перевода
строки
5
X или VERBOSE
Игнорирует неэкранированные пробельные
символы и комментарии в строке шаблона
6
U или UNICODE
При сопоставлении с символами \w, \W, \b и \B
используется информация из базы данных о
свойствах символов (только в Python 2; в Python 3
Юникод используется по умолчанию)
7
A или ASCII
Сопоставление выполняется только с 8-битными
символами ASCII (только в Python 3)
9.1 Основные методы объекта регулярных выражений
Объекты шаблонов имеют несколько методов и атрибутов. Основные
методы представлены в таблице.
1. p.match() проверяет, начинается ли совпадение регулярного выражения с начала строки. Если соответствие найдено, то возвращается объект Match, иначе None.
Формат метода:
match(Строка[, Начальная_позиция[, Конеч-
ная_позиция]])
58

9.1 Основные методы объекта регулярных выражений
Примеры:
>>>import re
>>>p = re.compile(r”[0-9]+”)
>>>print(‘Найдено’ if p.match(‘str123’) else ‘Нет’)
Нет
>>>import re
>>>p = re.compile(r”[0-9]+”)
>>>print(‘Найдено’ if p.match(‘str123’,3) else ‘Нет’)
Найдено
2. p.search() – проверяет соответствие с любой частью строки. Если
соответствие найдено, то возвращается объект Match, иначе None.
Формат метода:
search(Строка[, Начальная_позиция[, Конеч-
ная_позиция]])
Примеры:
>>>import re
>>>p = re.compile(r”[0-9]+”)
>>>print(‘Найдено’ if p.search(‘str123’) else ‘Нет’)
Найдено
>>>import re
>>>p = re.compile(r”[0-9]+”)
>>>print(’Найдено’ if p.search(’123str,3’) else
’Нет’)
нет
3. p.findall() – ищет все совпадения с шаблоном.
Формат метода:
findall(Строка[, Начальная_позиция[, Конеч-
ная_позиция]])
59

9. Модуль re
Примеры:
>>>import re
>>>p = re.compile(r”[0-9]+”)
>>>p.findall(’10,20,30,35’)
[’10’, ’20’, ’30’, ’35’]
>>>import re
>>>p = re.compile(r”[a-z]+”)
>>>p.findall(’10,20,30,35’)
[]
4. p.finditer() – ищет все совпадения с шаблоном, возвращает итератор, а не список. На каждой итерации цикла возвращает объект Match.
Формат метода:
finditer(Строка[, Начальная_позиция[, Конеч-
ная_позиция]])
Примеры:
>>>import re
>>>p = re.compile(r”[0-9]+”)
>>>for m in p.finditer(’10, 20, 30, 35’):
print(m.group(0), ‘start:’, m.start(), ‘end:’,
m.end())
10 start: 0 end:1
20 start: 4 end:5
30 start: 8 end:9
35 start:12 end:13
5. p.sub() – ищет все совпадения с шаблоном и заменяет их указанным
значением. Если совпадения не найдены, возвращается исходная строка.
Формат метода:
sub(Новый_фрагмент_или_функция, Строка замены[, Максимальное количество замен])
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
