Простой Python. Современный стиль программирования (Любанович) - страница 110

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) nextnext, если перед ним находится 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 использует специальные