Если в группе после открывающейся круглой скобки поставить специальные символы - можно создать особое скобочное выражение, которое добавит новую функциональность регулярным выражениям.
- (?#) - комментарий в регулярном выражении (Comment group)
"Слева(?#коментарий) и справа" -> Слева и права
- (?:) - группирует регулярное выражение, но не захватывает в его группу (Non-capturing group)
- его можно использовать, например, чтобы применять квантификаторы сразу к нескольким символам
(?:\d.){2} равносильно \d.\d.
- его можно использовать, например, чтобы применять квантификаторы сразу к нескольким символам
Даже после изучения работы с группами в Python группы имеет смысл использовать только тогда, когда вы к ним обращаетесь или работаете с их данными. Во всех остальных случаях нужно использовать Non-capturing group.
Очень полезные скобочные группы, которые позволяют "смотреть" что находится сзади и спереди регулярных выражений. Часто используются, когда нужно найти текст или какую-то последовательность между символами, которые НЕ нужно захватывать в регулярное выражение.
Не захватывают никаких символов:
- (?=) - проверяет стоит ли переданное выражение после шаблона
- (?!) - проверяет что переданное выражение НЕ стоит после шаблона
- (?<=) - проверяет стоит ли переданное выражение перед шаблоном
- (?<!) - проверяет что переданное выражение НЕ стоит перед шаблоном
Регулярное выражение: 2(?= 3)
Находит 2 тут: 1 2 3
Но не тут: 6 2 8
Можно комбинировать несколько Lookahead и Lookbehind, причем они будут обрабатывать символы не перед друг-другом, а перед последующей скобочной конструкцией (см. пример).
Обратите внимание, что все выражения в lookbehind должны быть фиксированной ширины, иначе вы получите ошибку
# Вызовут ошибку:
r'(?<=test{0,})regex'
r'(?<=g?)regex'
r'(?<!Python+)regex'
# Длина вхождений выражений в Lookbehind может быть разной
# Поэтому появится ошибка
# Ошибки не будет:
r'(?<=test)regex'
r'(?<=g{21})regex'
r'(?<!Pytho[mn])regex'
# Длина вхождений выражений в