Для работы с RE в Python используется модуль ``re``. Символ ``\`` в строках Python необходимо экранировать,
а также это является требованием для символов RE. Поэтому текст ``\p`` в форме RE должен быть записан как ``\\p``, а строка Python для RE должна быть
записана как ``'\\\\p'``. Для упрощения записи RE в Python используется строка с префиксом ``r``: ``r'\\p'``.
--
Функция|Назначение
--|--
re.search(RE, `s`) | Найти в строке `s` первую подстроку, соответствующую RE
re.fullmatch(RE, `s`) | Проверить, соответствует ли строка `s` указанному RE
re.split(RE, `s`, `count=0`) | Разделить строку `s` по подстрокам, соответствующим RE, не более `count` раз или до конца строки при `count=0`
re.findall(RE, `s`) | Найти в строке `s` все непересекающиеся подстроки, соответствующие RE
re.finditer(RE, `s`) | Итератор по всем непересекающимся подстрокам, соответствующим RE
re.sub(RE, `r`, `s`, `count=0`) | Заменить в строке `s` `count` первых (или все для `count=0`) непересекающихся подстрок, соответствующие RE, на `r`
--
Каждой из функций, перечисленных выше, можно дать дополнительный параметр ``flags``
Константа|Назначение
--|--
re.ASCII|только символы ASCII
re.IGNORECASE | игнорировать регистр
re.MULTILINE | Метасимволы ``^`` и ``$`` соответствуют началу и концу каждой строки
re.DOTALL | Метасимвол ``.`` включает ``\n``
--
Если функции re.search, re.fullmatch не находят соответствие RE в строке, то они возвращают None, функция re.finditer
не выдаёт ничего. Однако если соответствие найдено, то возвращается match-объект.
Метод|Назначение
--|--
match\[`n`\]\
match.group(`n`)|Подстрока, соответствующая `n`-й группе; по умолчанию 0 -- соответствие всему RE
match.start(`n`)|Индекс начала подстроки, соответствующей `n`-й группе
match.end(`n`)|Индекс конца подстроки
match.span(`n`)|Пара индексов начала и конца подстроки
--
```python
import re
x='12/7'
z='color: #ff0000;'
if re.fullmatch(r'(\d+)/(\d+)',x):
print('строка содержит рациональное число')
else:
print('строка содержит что-то другое')
parts=re.fullmatch(r'(\d+)/(\d+)',x)
if parts:
print("числитель: {} знаменатель : {}".format(parts[1],parts[2]));
print(parts.span(2));
parts=re.search(r'#[a-f0-9]{6}',z)
if parts:
print("найден цвет: {} в позиции: {}".format(parts.group(),parts.start()))
```
--
В функции замены можно указать строку, в которой заданы номера групп после ``\``, или функцию (лямбда-выражение), которая получает match-объект:
```python
import re
y='Christmas holiday from 12/21/2015 to 01/03/2016'
# замена формата всех дат в тексте с m/d/y на d-m-y
print(re.sub(r'(\d+)/(\d+)/(\d+)',r'\2-\1-\3',y))
s='Artificial Intelligence in Computer Science is an ideal "intelligent" machine.'
# замена на аббревиатуры
print(re.sub(r'\b[A-Z][a-z]+( [A-Z][a-z]+)+\b',
lambda m: m[0]+' ('+re.sub(r'[a-z ]+','',m[0])+')',s))
```
--
```python
import re
# выбрать все слова в тексте txt
txt='...'
for w in re.split(r'\s+',txt):
print(w)
# выбрать все ссылки в гипертексте htm
htm='...'
for m in re.finditer(r'<a\s+href="([^"]+)">',htm):
print(m.group(1))
```