Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Язык программирования высокого уровня Python. Функции, структуры данных, дополнительные модули. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]