or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
Тема 9
Регулярные выражения
© Яценко Р.Н., 2019-2021
Учебный центр компьютерных технологий "Кит"
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →1. Введение в регулярные выражения (re)
Назначение
Проще говоря, регулярное выражение используется для поиска паттернов в указанной строке. Паттерном может быть все что угодно
Можно создавать паттерны соответствия электронной почте или мобильному номеру. Можно создать паттерны, которые ищут слова в строке, начинающиеся на “a” и заканчивающиеся на “z”
Где используются
Проверка соответствия фрагментов текста некоторым критериям. Например, наличие символа обозначения валюты и последующих за ним цифр, проверка адреса электронной почты и т.д.
Поиск подстрок, которые в том числе могут иметь несколько форм. Например, поиск
'pet.png'
,'pet.jpg'
,'pet.jpeg'
или'pet.svg'
, но не обнаруживались подстроки'carpet.png'
и подобные ейЗамена всего, что совпадает с шаблоном, на указанную строку. Например, поиск подстроки
'устройство передвижения, движимое мускульной силой'
и замена подстрокой'велосипед'
Разбиение строки по точкам совпадения с шаблоном. Например, разбиение строки по
':'
или'='
Пример кода
Примеры выражений
Для написания и отладки регулярных выражений удобно использовать онлайн-сервисы, например https://regex101.com, которые в том числе содержат библиотеку готовых выражений и могут генерировать код для различных языков программирования
https://regex101.com/r/HDScOu/1
2. Язык регулярных выражений
Определение
Строка-шаблон
Флаги
Флаги не входят непосредственно в регулярное выражение, однако расширяют его функции:
'g'
– глобальный поиск (обрабатываются все совпадения с шаблоном поиска)'i'
– регистр букв не имеет значения (по умолчанию любой поиск регистрозависим)'m'
– многострочный поискФлаг указывается после паттерна, например:
'/[0-9]/m'
Поиск символов и строк
Одним из наиболее простых случаев является поиск отдельных символов и строк
https://regex101.com/r/Y67E75/1
Экранирование специальных символов
Специальные символы (символы-джокеры должны экранироваться символом обратного слеша
'\'
. К ним относятся:В пределах регулярных выражений можно также использовать большинство стандартных экранированных последовательностей языка Python, например,
'\n'
,'\t'
и др.Поиск множества символов
Для поиска не конкретной последовательности символов, а некоторого их множества предназначены классы символов
Пример:
'[аеёиоуэюя]'
позволяет найти все гласные буквы в строке'п[ое]л'
даст совпадение для слов'пел'
и'пол'
, но не найдет слова'поел'
или'пил'
группа_символов
. По умолчанию при сопоставлении учитывается регистр.Пример:
'[^аеёиоуэюя]'
обнаружит все символы в тексте, кроме гласных буквпервый
допоследний
Пример:
'[0-9]'
найдет все цифры в тексте.
(точка)'.'
соответствует какому-либо одному знаку, кроме'\n'
. Для поиска точки необходимо использовать экранирование:'\.'
Пример:
'м.л'
найдет в тексте'мел'
,'мул'
и т.д.\w
Пример:
'\w1'
найдет в тексте'11'
или'я1'
\W
\s
\S
\d
Пример:
'\d-й'
найдет в тексте'1-й'
или'2-й'
\D
Квантификаторы
Зачастую требуется не только найти слово по символам или группе символов, но и указать количество возможных повторений, для чего в регулярных выражениях используются квантификаторы
Квантификаторы записываются после символа/строки/множества
Виды квантификаторов
'*'
'+'
'?'
'{m}'
m
раз'{m,}'
m
и более раз'{m, n}'
m
доn
разЖадность и лень
Каждый квантификатор может быть:
По умолчанию, все квантификаторы являются жадными; для включения «ленивого» режима необходимо поставить знак
'?'
после квантификатораРазница между жадным и ленивым режимом
https://regex101.com/r/grLIWd/1
https://regex101.com/r/grLIWd/2
Задания
https://regex101.com/r/aGn8QC/2
\b
— граница слова)\b
— граница слова)*
(.
— это точно не конец строки!)3. Модуль re
"Сырые" строки
В коде регулярные выражения обычно записываются в виде «сырых» строк (с префиксом
r
, подавляющих экранирование).Так, при поиске переноса строки удобнее указать
r"\n"
вместо"\\n"
, избежав необходимости дублировать экранирующий символСпособы работы
re
. При этом во время вызова функции, произойдет компиляция регулярного выражения и дальнейший поиск соответствийre.regex
), а затем использовать его методыФункции модуля re
re.search(pattern,
string)
string
первую строчку, подходящую под шаблонpattern
re.fullmatch(pattern,
string)
string
под шаблонpattern
re.split(pattern,
string,
maxsplit=0)
str.split()
, только разделение происходит по подстрокам, подходящим под шаблонpattern
re.findall(pattern,
string)
string
все непересекающиеся шаблоныpattern
re.finditer(pattern,
string)
pattern
в строкеstring
(выдаютсяmatch
-объекты)re.sub(pattern,
repl,
string,
count=0)
string
все непересекающиеся шаблоныpattern
наrepl
Примеры
Дополнительные флаги
re.ASCII
\w
,\W
,\b
,\B
,\d
,\D
,\s
,\S
соответствуют все юникодные символы с соответствующим качеством.re.ASCII
ускоряет работу, если все соответствия лежат внутри ASCIIre.IGNORECASE
re.MULTILINE
^
и$
соответствуют началу и концу каждой строкиre.DOTALL
\n
конца строки не подходит под точку. С этим флагом точка — вообще любой символПримеры
Компиляция регулярок
re.compile(pattern, flags=0)
pattern
, используя флагиflags
(например,re.MULTILINE
) и возвращает объект классаre.regex
Пример:
Match-объекты
Если функции
re.search
,re.fullmatch
не находят соответствие шаблону в строке, то они возвращаютNone
, функцияre.finditer
не выдаёт ничегоЕсли соответствие найдено, то возвращается
match
-объект. Эта штука содержит в себе кучу полезной информации о соответствии шаблонуАтрибуты match
match[0]
,match.group()
match.start()
match.end()
4. Группировка и выбор
Группирующие скобки (…)
(...)
без?:
, то они становятся группирующимиre.search
,re.fullmatch
иre.finditer
, по каждой такой группе можно получить ту же информацию, что и по всему шаблону:(...)
Пример с группами
Особенности групп с квантификатором
match
-объекте будет создана только для последнего соответствия'--- Опять45 ---'
квантификаторы были снаружи от скобок
'\s*([А-Яа-яЁё])+(\d)+\s*'
, то вывод был бы таким:Вложенные скобки
Внутри группирующих скобок могут быть и другие группирующие скобки.
В этом случае их нумерация производится в соответствии с номером появления открывающей скобки в шаблоне
Использование групп при заменах
re.sub
) очень удобную возможность: в шаблоне для замены можно ссылаться на соответствующую группу при помощи\1, \2, \3, ...
ММ/ДД/ГГГГ
перевести в удобныйДД.ММ.ГГГГ
, то можно использовать такую регулярку:Невыделяемая группа
(?:часть_выражения)
Пример:
'(?:\w+)\s'
выполнит в тексте поиск слов, отделенных пробельным символом; при этом слово НЕ будет захвачено в отдельную группуВыбор
Операция выбора позволяет захватить одно из нескольких выражений в качестве результата поиска
выражение1|выражение2|выражение3
'|'
Пример
'красн(?:ый|оватый|енький)'
найдет в тексте слова'красный'
,'красноватый'
,'красненький'
; при этом окончание не будет захвачено в группу5. Проверка границ (привязки)
Простые шаблоны
^
flag=re.MULTILINE
^Привет
$
flag=re.MULTILINE
Будь здоров!$
\A
\Z
\b
\bвал
\B
\Bвал
\Bвал\B
Сложные шаблоны (lookaround)
(?=...)
...
Isaac (?=Asimov)
(?!...)
...
Isaac (?!Asimov)
(?<=...)
...
Длина шаблона должна быть фиксированной
(?<=abc)def
(?<!...)
...
(?<!abc)def
Примеры
(?<!\d)\d(?!\d)
(?<=#START#).*?(?=#END#)
#START#
до#END#
\d+(?=_(?!_))
^(?:(?!boo).)*?$
boo and zoo>br>and others
^(?:(?!boo)(?!foo).)*?$
boo and zoo
and others
Спасибо за внимание!
© Яценко Р.Н., 2019-2021
Учебный центр компьютерных технологий "Кит"