Regular expression

Python

 

vkrysanov320@gmail.com

Конструкции поиска

import re

s       = '...'
pattern = r'...'

finded  = [x.group() for x in re.finditer(pattern, s)]

Метасимвол []

[0-9] Любая цифра от 0 до 9
[1-4] То же самое, что [1234]
[A-Z] Любая заглавная буква от A до Z
[a-z] Любая строчная буква от A до Z
[a-e] То же самое, что [abcde]
[^a-c] Любой символ кроме a или b или c
[^0-9] Любой символ, который не является цифрой

Квадратные скобки [] определяют набор символов для соответствия:

[abc] — любая буква a или b или c: abcd => 2 соответствия

(a|b|c) — аналогично

Квантификаторы

{n} Ровно n повторений [1-9]{4} 1, 12, 123, 1234, 12345
{m,n} От m до n повторений включительно [1-9]{2,3} 1, 12, 123, 1234, 12345
{m,} Не менее m повторений [1-9]{3,} 1, 12, 123, 1234, 12345
{,n} Не более n повторений [1-9]{,2} 1, 12, 123, 1234, 12345
? Ноль или одно вхождение, синоним {0,1} [1-9]? 1, 12, 123, 1234, 12345
* Ноль или более, синоним {0,} [1-9]* 1, 12, 123, 1234, 12345
+ Одно или более, синоним {1,} [1-9]+ 1, 12, 123, 1234, 12345

По умолчанию квантификаторы жадные — захватывают максимально возможное число символов!

Добавление ? делает их ленивыми, они захватывают минимально возможное число символов:  [1-9]{3,}? => 1, 12, 123, 1234, 12345

Квантификаторы указывают, сколько раз должен повторяться символ или группа символов.

Метасимвол \

Бэкслеш \ используется для экранирования различных символов, включая метасимволы:

[a-z]?\? => abcd?, as?

Группировка и скобочные группы (1)

Круглые скобки () используются для создания подшаблонов:

([1-9][a-z])+ Подстрока цифра-буква (не менее одного раза) 1a2b3c003a
[1-9][0-9]*([+-][1-9][0-9]*)* Число-оператор(+/-)-число 1+2+3-4s+12-12c

Группировка и скобочные группы (2). Positive lookahead (?=())

Конструкция (?=()) используется для поиска пересекающихся паттернов:

import re

s = '8754112832136130'
pattern  = r'(?=([1-2][0-2]*))'
pattern2 = r'([1-2][0-2]*)'		 	# без (?=())

# Обратите внимание на group(1)
print([x.group(1) for x in re.finditer(pattern, s)])
# => ['112', '12', '2', '21', '1', '1']

# либо вывести подходящие подстроки так:
print(re.findall(pattern, s))
# => ['112', '12', '2', '21', '1', '1']
 
print(re.findall(pattern2, s))		# без (?=())
# => ['112', '21', '1']

Регулярные выражения Python

By vkrysanov320

Регулярные выражения Python

  • 4