|
prev +? | Одно или больше включений prev, минимальное количество |
prev { m } | m последовательных включений prev |
prev { m, n } | От m до n последовательных включений prev, максимальное количество |
prev { m, n }? | От m до n последовательных включений prev, минимальное количество |
[abc] | a, или b, или c (аналогично a|b|c) |
[^abc] | Не (a, или b, или c) |
prev (?= next) | prev, если за ним следует next |
prev (?! next) | prev, если за ним не следует next |
(?<=prev) next | next, если перед ним находится prev |
(? | next, если перед ним не находится prev |
У вас могло зарябить в глазах при попытке прочесть эти примеры. Для начала определим строку-источник:
>>>> source = '''I wish I may, I wish I might
>… Have a dish of fish tonight.'''
Найдем во всем тексте строку 'wish':
>>>> re.findall('wish', source)
>['wish', 'wish']
Далее найдем во всем тексте строки 'wish' или 'fish':
>>>> re.findall('wish|fish', source)
>['wish', 'wish', 'fish']
Найдем строку 'wish' в начале текста:
>>>> re.findall('^wish', source)
>[]
Найдем строку 'I wish' в начале текста:
>>>> re.findall('^I wish', source)
>['I wish']
Найдем строку 'fish' в конце текста:
>>>> re.findall('fish$', source)
>[]
Наконец, найдем строку 'fish tonight.$' в конце текста:
>>>> re.findall('fish tonight.$', source)
>['fish tonight.']
Символы ^ и $ называются якорями: с помощью якоря ^ выполняется поиск в начале строки, а с помощью якоря $ — в конце. Сочетание.$ совпадает с любым символом в конце строки, включая точку, поэтому выражение сработало. Для обеспечения большей точности нужно создать управляющую последовательность, чтобы найти именно точку:
>>>> re.findall('fish tonight\.$', source)
>['fish tonight.']
Начнем с поиска символов w или f, за которым следует буквосочетание ish:
>>>> re.findall('[wf]ish', source)
>['wish', 'wish', 'fish']
Найдем одно или несколько сочетаний символов w, s и h:
>>>> re.findall('[wsh]+', source)
>['w', 'sh', 'w', 'sh', 'h', 'sh', 'sh', 'h']
Найдем сочетание ght, за которым следует любой символ, кроме буквенного или цифрового символа или знака подчеркивания:
>>>> re.findall('ght\W', source)
>['ght\n', 'ght.']
Найдем символ I, за которым следует сочетание wish:
>>>> re.findall('I (?=wish)', source)
>['I ', 'I ']
И наконец, сочетание wish, перед которым находится I:
>>>> re.findall('(?<=I) wish', source)
>[' wish', ' wish']
Существует несколько ситуаций, в которых правила шаблонов регулярных выражений конфликтуют с правилами для строк Python. Следующий шаблон должен совпасть с любым словом, которое начинается с fish:
>>>> re.findall('\bfish', source)
>[]
Почему этого не произошло? Как мы говорили в главе 2, Python использует специальные