Использование скобок в регулярных выражениях



Для обозначения группы символов регулярного выражения используются круглые скобки, которые, являясь метасимволами, определяют операции, их область действия и приоритет над указанными в группе символами.
В настоящее время скобкам регулярных выражений уделяется особое внимание. Например, разработчики последних версий языка PERL дальнейшее развитие РВ видят не в создании новых метасимволов или разработке новых методов, а в использовании скобок для задания специальных выражений, расширяющих функциональные возможности регулярных выражений. По этому пути пошли и разработчики яыка Python – для указания особенностей регурярных выражений языка Python в скобках помещается буква "P" (см. ниже).
Шаблон внутри группы обрабатывается как единое целое, может быть квалифицирован и выполняет сделующие функции:

· (. . .) – находит и запоминает подстроку согласно РВ ". . .". Это "скобки с запоминанием". Они, во-первых, выполняют типичную для них роль объединения отдельных частей в единое целое (как в математике), например (abc){3} – означает троекратное повторение последовательности букв abc. Во-вторых, они запоминают в памяти результаты поиска, к которым в последствии можно обратиться. Для задания в строке символов '(' и ')', представляющих самих себя, можно использовать обратные слэши: \( и \) или символьные классы [(] и [)]. Например, скобки могут быть использованы при преобразовании даты из формата "ММ/ДД/ГГГГ" в формат "ДД.ММ.ГГГГ". При этом в регулярном выражении создаются три пары скобок, содержащие РВ для поиска трех подстрок: первая – цифр номера месяца, вторая – цифр дня месяца, третья – цифр года:

>>> date = '03/11/2016'
>>> m=re.match( r'(\d{1,2})/(\d{1,2})/(\d{4})$' ,date)
>>> if m: print (m.group(2), '.' , m.group(1), '.' , m.group(3), sep= '' )
else : print ( 'Дата задана неверно' )
11.03.2016 ;

· (?: . . . ) – это "скобки без запоминания". Они выполняют только функцию объединения. Поэтому, если результат группы в дальнейшем не понадобится, лучше использовать этот вид группирования. Это повышает скорость выполнения;

· (?aiLmsux) – один или более символов из набора 'a', 'i', 'L', 'm', 's', 'u', 'x' указывает на наличие в РВ соответствующего флага (см. подраздел 2.1.1): re.A (сравнение только с ASCII-символами), re.I (игнорируется регистр), re.L (зависимость от внутренней кодировки), re.M (строка содержит несколько символов \n), re.S (точка сравнивает все) и re.X (удобный вид). Поиск слов без использования флага IGNORECASE:

>>> p=re.compile( r'[A-Z]\w+' )
>>> p.findall ( 'The cat and the dog' )
['The']

и с использованием флага IGNORECASE:

>>> p=re.compile( r'(?i)[A-Z]\w+' )
>>> p.findall ( 'The cat and the dog' )
['The', 'cat', 'and', 'the', 'dog'] ;

· (?P<name>. . .) – задает имя группы name. В дальнейшем по этому имени можно обращаться к группе. Имена групп в пределах регулярного выражения должны различаться:

>>> m=re.match( r'(?P<first_name>\w+)\s(?P<second_name>\w+)' , 'Isaac Newton' )
>>> m.group ( 'first_name' )
'Isaac'
>>> m.group ( 'second_name' )
'Newton'
>>> m.group ()
'Isaac Newton' ;

· (?= . . .) – находит сравнение, если только дальше следует ". . . ". Например, метод sub() заменяет в строке s строчные буквы i на заглавные I только в названиях фирмы:

>>> s= 'Фирма intel выпускает процессоры серии intel Core: i7, i5 и i3'
>>> p=re.compile( 'i(?=ntel)' )
>>> p.sub ( 'I' ,s)
'Фирма Intel выпускает процессоры серии Intel Core: i7, i5 и i3';

· (?! . . . ) – находит подстроку, если только дальше не следует ". . . ". Например, РВ не находит в строке первое слово "a", поскольку дальше следует пробел :

>>> p=re.compile( r'a \w+(?!\s)' )
>>> p.search ( 'a atom' )
'atom';

· (?<= . . . ) – находит подстроку, если только ей предшествоовало ". . . ". Например, РВ находит в строке только те числа, которым предшествовал символ "№":

>>> p=re.compile( r'(?<=№)\d+' )
>>> p.findall ( '1, №2, №33, 4, 55' )
['2', '33'];

· (?<! . . . ) – находит подстроку, если только ей не предшествовало ". . . ";

Одно из применений группирования – повторное использование ранее найденных групп символов (подстрок, блоков, отмеченных подвыражений). При обработке выражения подстроки, найденные по шаблону внутри группы, сохраняются в памяти и получают номер начиная с единицы. Каждой подстроке соответствует пара скобок в регулярном выражении. Python поддерживается до 99 нумерованных подстрок с номерами от 1 до 99. В регулярном выражении можно ссылаться на раннее найденные группы по их номерам, используя обратный слэш – \1 - \99. Например, найдем в строке повторяющиеся слова:

>>> p=re.compile( r'(\b\w+)\s+\1' )
>>> p.search( 'The cat and the the dog' ).group()
'the the'.


Дата добавления: 2021-11-30; просмотров: 24; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!