Table of Contents

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

Темы:

Основы

Для работы с регулярными выражениями в python используется модуль re.
В начале каждого скрипта его надо имортировать.

In [1]: import re

Модуль re поддерживает след. функции:

In [2]: re.           
            A           copyreg     enum        findall()   functools   L           match       RegexFlag   search      sre_parse   T           U           X           
            ASCII       DEBUG       error       finditer()  I           LOCALE      MULTILINE   S           split       sub         TEMPLATE    UNICODE                 
            compile()   DOTALL      escape()    fullmatch() IGNORECASE  M           purge       Scanner     sre_compile subn        template    VERBOSE                 

Самые часто используемые будут:

Пример:

In [8]: STR = 'dynamic-vpn                           0            2           0    permanent'
 
In [9]: MATCH = re.search('permanent', STR)
 
In [10]: MATCH
Out[10]: <_sre.SRE_Match object; span=(68, 77), match='permanent'>

В примере сделали:



Синтаксис

Наборы символов

Примеры:

\w\D+\S+\d - сначала идет одна любая буква или цифра, потом одна или более буква (плюс спец символы), далее один или более символов кроме whitespace и закончится совпадение должно одной цифрой.

In [145]: re.search('\w\D+\S+\d', L)
 
In [146]: L = '44w5'
 
In [147]: re.search('\w\D+\S+\d', L)
 
In [148]: 
 
In [148]: 
 
In [148]: L =  'a56c5-5b6'
 
In [149]: re.search('\w\D+\S+\d', L)
Out[149]: <_sre.SRE_Match object; span=(2, 9), match='6c5-5b6'>
 
In [150]: L =  'a56c5-56'
 
In [151]: re.search('\w\D+\S+\d', L)
Out[151]: <_sre.SRE_Match object; span=(2, 8), match='6c5-56'>
 
In [152]: L =  'ab3cd6'
 
In [153]: re.search('\w\D+\S+\d', L)
Out[153]: <_sre.SRE_Match object; span=(0, 6), match='ab3cd6'>
 
In [154]: L =  'a56c56'
 
In [155]: re.search('\w\D+\S+\d', L)
Out[155]: <_sre.SRE_Match object; span=(2, 6), match='6c56'>
 
In [156]: L =  'abc-_3'
 
In [157]: re.search('\w\D+\S+\d', L)
Out[157]: <_sre.SRE_Match object; span=(0, 6), match='abc-_3'>
 
In [158]: L =  'abc-_3a'
 
In [159]: re.search('\w\D+\S+\d', L)
Out[159]: <_sre.SRE_Match object; span=(0, 6), match='abc-_3'>
 
In [160]: L =  'abc-_a'
 
In [161]: re.search('\w\D+\S+\d', L)
 
In [162]: L =   'a36c'
 
In [163]: re.search('\w\D+\S+\d', L)

Символы повторения

Примеры:
ab+b

In [27]: L = 'abbba'
 
In [28]: re.search('ab+b', L)
Out[28]: <_sre.SRE_Match object; span=(0, 4), match='abbb'>

ab*a

In [40]: L = 'aaaaa'
 
In [41]: re.search('ab*a', L)
Out[41]: <_sre.SRE_Match object; span=(0, 2), match='aa'>
 
In [44]: L = 'abababaaba'
 
In [45]: re.search('ab*a', L)
Out[45]: <_sre.SRE_Match object; span=(0, 3), match='aba'>

a?b+c* - в совпадении должны быть ноль или один символ ф (a?), один и более символов b (b+) и ноль или более символов с (с*).

In [118]: L = 'abbbabbb'
 
In [119]: re.search('a?b+c*', L)
Out[119]: <_sre.SRE_Match object; span=(0, 4), match='abbb'>

a{2}b{2,3}c{3,}

In [133]: L =   'aabbbccccc'
 
In [134]: re.search('a{2}b{2,3}c{3,}', L)
Out[134]: <_sre.SRE_Match object; span=(0, 10), match='aabbbccccc'>

Специальные символы

Примеры:
[abc]

In [111]: L = 'ecabababaaba'
 
In [112]: re.search('[abc]', L)
Out[112]: <_sre.SRE_Match object; span=(1, 2), match='c'>

[abc]+

In [58]: L = 'abababaaba'
 
In [59]: re.search('[abc]+', L)
Out[59]: <_sre.SRE_Match object; span=(0, 10), match='abababaaba'>

a.[b-d]+ - совпадение (не строка) должно начитаться с a, потом любой символ, потом любая последовательность символов содержащая b, c и d

In [69]: L =   'abbbabbb'
 
In [70]: re.search('a.[b-d]+', L)
Out[70]: <_sre.SRE_Match object; span=(0, 4), match='abbb'>

^a.[^b-d]+ - строка должна начитаться с a, потом любой символ, потом любая последовательность символов не содержащая b, c и d.

In [76]: L =  'abababaaba'
 
In [77]: re.search('^a.[^b-d]+', L)
Out[77]: <_sre.SRE_Match object; span=(0, 3), match='aba'>

^a.[b-d]+$ - строка должна начитаться с a, потом любой символ, потом любая последовательность символов содержащая b, c и d и потом сразу должен идти конец строки.

In [89]: L =  'abc'
 
In [90]: re.search('^a.[b-d]+$', L)
Out[90]: <_sre.SRE_Match object; span=(0, 3), match='abc'>

(ab|ac) - ab или ac.

In [105]: L = 'aabab'
 
In [106]: re.search('(ab|ac)', L)
Out[106]: <_sre.SRE_Match object; span=(1, 3), match='ab'>