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