Skip to content

Latest commit

 

History

History
58 lines (43 loc) · 3.42 KB

File metadata and controls

58 lines (43 loc) · 3.42 KB

2.11 Скобочные выражения

Если в группе после открывающейся круглой скобки поставить специальные символы - можно создать особое скобочное выражение, которое добавит новую функциональность регулярным выражениям.

  • (?#) - комментарий в регулярном выражении (Comment group)

"Слева(?#коментарий) и справа" -> Слева и права

  • (?:) - группирует регулярное выражение, но не захватывает в его группу (Non-capturing group)
    • его можно использовать, например, чтобы применять квантификаторы сразу к нескольким символам
      (?:\d.){2} равносильно \d.\d.
      

Даже после изучения работы с группами в Python группы имеет смысл использовать только тогда, когда вы к ним обращаетесь или работаете с их данными. Во всех остальных случаях нужно использовать Non-capturing group.

Lookahead и Lookbehind

Очень полезные скобочные группы, которые позволяют "смотреть" что находится сзади и спереди регулярных выражений. Часто используются, когда нужно найти текст или какую-то последовательность между символами, которые НЕ нужно захватывать в регулярное выражение.

Не захватывают никаких символов:

  • (?=) - проверяет стоит ли переданное выражение после шаблона
  • (?!) - проверяет что переданное выражение НЕ стоит после шаблона
  • (?<=) - проверяет стоит ли переданное выражение перед шаблоном
  • (?<!) - проверяет что переданное выражение НЕ стоит перед шаблоном
Регулярное выражение: 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'

# Длина вхождений выражений в