Регулярное выражение
Регулярное выражение (или RE) определяет набор строк, который ему соответствует; функции в этом модуле позволяют проверить, соответствует ли конкретная строка заданному регулярному выражению (или соответствует ли данное регулярное выражение определенной строке, что сводится к тому же самому).
Содержание:
- Сравнить теги HTML
- re.findall () строка соответствия
- Сравнение групп
- Группа без захвата
- Обратная ссылка
- Именованная группировка (? P )
- Подстановочная строка
- Посмотрите вокруг
- Сопоставьте общее имя пользователя или пароль
- Сопоставьте шестнадцатеричное значение цвета
- Соответствие электронной почты
- Соответствие URL
- Соответствие IP-адреса
- Соответствие Mac-адреса
- Lexer
- Регулярное выражение Python — упражнения, практика, решение
В следующей таблице представлен список и описание специального шаблона совпадающие символы, которые можно использовать в регулярных выражениях.
Специальные символы |
Описание | ||||||||
---|---|---|---|---|---|---|---|---|---|
. | (Точка). В режиме по умолчанию это соответствует любому символу, кроме новой строки. Если указан флаг DOTALL, он соответствует любому символу, включая новую строку. | ||||||||
^ | (Caret.) Соответствует начало строки или строки. Например,/^ A/не соответствует ‘A’ в «О статьях», но соответствует ему в «Жизни» | ||||||||
$ | Соответствует концу строки или строки. Например,/e $/не соответствует «t» в «точном», но соответствует ему в «w3resource». | ||||||||
* | Соответствует предыдущему символу 0 или более раз. Например,/bo */соответствует ‘boo’ в «Загрузочном USB-накопителе» и ‘b’ в «Красивом уме», но ничего в «Постоянно действующем предприятии». | ||||||||
+ | Соответствует предыдущему символу 1 или более раз. Например,/a +/соответствует ‘a’ в «Daniel» и всем a в «Daaam» | ||||||||
? | Соответствует предыдущему символу 0 или 1 раз. Например,/r? Eu?/Соответствует «re» в «w3resource» и «eu» в «европе». | ||||||||
* ?, + ?, ?? | Символы ‘*’, ‘+’ и ‘?’ квалификаторы все жадные; они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE сопоставляется с « b », он будет соответствовать всей строке, а не только «». Добавление? после того, как квалификатор заставит его выполнить матч не жадным или минимальным образом; будет сопоставлено как можно меньше символов. Использование RE Будет соответствовать только ‘‘. | ||||||||
{m} | Указывает, что именно m копий предыдущего RE должны быть сопоставлены; меньшее количество совпадений приводит к тому, что весь RE не соответствует. Например, b {5} будет соответствовать ровно пяти символам ‘b’, но не четырем. | ||||||||
{m, n} | Заставляет результирующий RE соответствовать от m до n повторений предыдущего RE. Например, {2,5} будет соответствовать от 2 до 5 символов «a». Отсутствие m указывает на нулевую нижнюю границу, а отсутствие n указывает на бесконечную верхнюю границу. Например, {4,} b будет соответствовать ‘aaaab’ или тысяче символов ‘a’, за которыми следует ‘b’, но не ‘aaab’. | ||||||||
{m, n}? | Заставляет результирующий RE соответствовать от m до n повторений предыдущего RE, пытаясь сопоставить как можно повторений. Это нежадная версия предыдущего квалификатора. Например, в строке из 6 символов «aaaaaa» {3,5} будет соответствовать 5 символам «a», а {3,5}? будет соответствовать только 3 символам. | ||||||||
Либо экранирует специальные символы (позволяя вам сопоставлять такие символы, как ‘*’, ‘?’ И т. Д.) Или сигнализирует о специальной последовательности; специальные последовательности обсуждаются ниже. |
|||||||||
[] | Используется для обозначения набора символов. В наборе:
|
||||||||
| | A | B, где A и B могут быть произвольными RE, создает регулярное выражение, которое будет соответствовать либо A, либо B. Произвольное количество RE может быть разделено символом ‘ | ‘ этим способом. Это также можно использовать внутри групп (см. Ниже). | ||||||||
(…) | Соответствует любому регулярному выражению внутри круглых скобок и указывает начало и конец группы ; содержимое группы может быть получено после того, как было выполнено сопоставление, и может быть сопоставлено позже в строке с помощью специальной последовательности number, описанной ниже. Чтобы сопоставить литералы ‘(‘ или ‘)’, используйте (или ) или заключите их в класс символов: [(], [)]. | ||||||||
(? …) | Это обозначение расширения (‘?’ после ‘(‘ в противном случае не имеет значения). Первый символ после ‘?’ определяет, что значение и дальнейший синтаксис конструкции: расширения обычно не создают новую группу; (? P …) является единственным исключением из этого правила. Ниже перечислены поддерживаемые в настоящее время расширения. | ||||||||
(? aiLmsux) | (Одна или несколько букв из набора ‘a’, ‘i’, ‘L’, ‘m’, ‘s ‘,’ u ‘,’ x ‘.) Группа соответствует пустой строке; буквы устанавливают соответствующие флаги: re.A (соответствие только ASCII), re.I (игнорировать регистр), re.L (зависит от локали) , re.M (многострочный), re.S (точка соответствует всем), re.U (соответствие Unicode) и re.X (подробный) для всего регулярного выражения. | ||||||||
(?: …) | Версия регулярных скобок без захвата. Соответствует любому регулярному выражению внутри круглых скобок. es, но подстрока, сопоставленная группой, не может быть получена после выполнения сопоставления или на которую будет ссылаться позже в шаблоне. | ||||||||
(? imsx-imsx: … ) | (Ноль или более букв из набора ‘i’, ‘m’, ‘s’, ‘x’, необязательно, за которым следует ‘-‘, за которым следует одна или несколько букв из того же набора .) Буквы устанавливают или удаляют соответствующие флаги: re.I (игнорировать регистр), re.M (многострочный), re.S (точка соответствует всем) и re.X (подробный), для части выражение. | ||||||||
(? P …) |
Аналогично обычным скобкам, но подстрока, соответствующая группе, доступна через символическое имя группы. Имена групп должны быть действительными идентификаторами Python, и каждое имя группы должно быть определено только один раз в регулярном выражении. Символьная группа также является пронумерованной группой, как если бы группа не имела имени. На именованные группы можно ссылаться в трех контекстах. Если шаблон (? P [‘»]). *? (? P = quote) (т. Е. Соответствует строке, заключенной в одинарные или двойные кавычки): Контекст ссылки на группу «цитата» |
Способы ссылки на нее |
в том же самом шаблоне |
|
при обработке объекта соответствия m |
|
в строке, переданной в аргумент repl функции re. sub () |
|
|
Соответствует, если текущей позиции в строке предшествует совпадение для …, которое заканчивается в текущей позиции. Это называется утверждением положительного просмотра назад. (?
>>> import re >>> m = re.search ('(? >> m.group (0)' def '
В этом примере выполняется поиск слово после дефиса:
>>> m = re.search (r '(? >> m.group (0)' egg '
Соответствует пустой строке, но только в начале или в конце слова. Слово определяется как последовательность символов слова.
Соответствует любой символ, являющийся цифрой. Эквивалентно [0-9]. Например,/ d/или/[0-9]/соответствует ‘2’ в «E2 означает второй пример».
Соответствует любому символу пробела (включая табуляцию, новую строку, возврат каретки, перевод страницы, вертикальный вкладка). [ t n r f v].
Например,/ s w */соответствует «яблоку» в «Яблоке».
Соответствует рассматриваемым символам пробел в наборе символов ASCII; это эквивалентно [ t n r f v].
Соответствует символам, считающимся буквенно-цифровыми в набор символов ASCII; это эквивалентно [a-zA-Z0-9_]. Если используется флаг LOCALE, сопоставляет символы, считающиеся буквенно-цифровыми в текущей локали, и подчеркивание.
Соответствует любому символу, не являющемуся словом, эквивалент [^ A-Za-z0-9_]. Например,/ W/или/[^ $ A-Za-z0-9 _]/соответствует ‘$’ в «150 $»
Сравните теги HTML:
# открыть тег >>> import re >>> re.search ('] [^>] *> ',' ')! = NoneTrue >>> import re >>> re.search (' ] [^>] *> ',' ') ! = NoneTrue >>> import re >>> re.search ('] [^>] *>', '
')! = NoneTrue >>> import re >>> re.search ('] [^>] *>', '
')! = NoneFalse # закрывающий тег >>> import re >>> re.search ('[^>] +> ',' ')! = NoneTrue # self close >>> import re >>> re.search (' ] +/> ','
')! = NoneTrue
re.findall () строка соответствия:
# разделить ll string >>> import re >>> source = "split all string" >>> re.findall ('[ w] +', source) ['split', 'all', 'string'] # парсинг python Веб-сайт .org >>> import urllib >>> import re >>> x = urllib.urlopen ('https://www.w3resource.org') >>> html = x.read () >>> x.close () >>> print ("открытые теги") открытые теги >>> re.findall ('] [^>] *>', html) [0: 2] [' ',' '] >>> print ("закрыть теги") закрыть теги >>> re.findall (' [^>] +> ', html) [0: 2] ['', ''] >>> print ("самозакрывающиеся теги")
Сравнение групп:
# (...) группировать регулярное выражение >>> import re >>> mon = re.search (r '( d {4} ) - ( d {2}) - ( d {2}) ',' 2018-09-01 ') >>> mon >>> mon.groups () (' 2018 ',' 09 ',' 01 ') >>> mon.group ()' 2018-09-01 ') >>> mon.group (1)' 2018 '>>> mon.group (2) '09' >>> mon.group (3) '01' # Вложенные группы >>> import re >>> mon = re.search (r '((( d {4}) - d {2}) - d {2}) ',' 2018-09-01 ') >>> mon.groups () (' 2018-09-01 ',' 2018-09 ',' 2018 ') >>> mon.group ()' 2018- 09-01 '>>> пн. Группа (1)' 2018-09-01 '>>> пн. group (2) '2018-09' >>> mon.group (3) '2018'
Группа без захвата:
# группа без захвата >>> import re >>> url = 'http://w3resource.com/' >>> mon = re.search ('(?: http | ftp)://([^/ r n] +) (/[^ r n] *)? ', url) >>> mon.groups () (' w3resource.com ','/' ) # группа захвата >>> import re >>> mon = re.search ('(http | ftp)://([^/ r n] +) (/[^ r n] *)? ', url) >>> mon.groups () (' http ',' w3resource.com ','/')
Назад Ссылка:
# compare 'xx', 'yy' >>> import re >>> re.search (r '([az]) 1 $', ' xx ')! = NoneTrue >>> import re >>> re.search (r' ([az]) 1 $ ',' yy ')! = NoneTrue >>> import re >>> re.search (r '([az]) 1 $', 'xy')! = NoneFalse # сравнить открытый и закрывающий теги >>> import re >>> pattern = r '] +)> [ s S] *? 1> '>>> re.search (pattern,' test ')! = NoneTrue >>> re.search (pattern,' test
')! = NoneTrue >>> re.search (pattern,' test ')! = NoneFalse
Именованная группировка ( ? P ) :
# ссылка на группу `` (? P ...) `` >>> import re >>> pattern = '(? P d {4}) - (? P d {2}) - (? P d {2}) '>>> mon = re.search (pattern,' 2018- 09-01 ') >>> mon.group (' год ')' 2018 '>>> mon.group (' month ')' 09 '>>> mon.group (' day ')' 01 '# обратная ссылка `` (? P = name) `` >>> import re >>> re.search ('^ (? P [az]) (? P = char)', 'aa')
Строка замены:
# базовая замена >>> import re >>> res = "4x5y6z" >>> re.sub (r '[az]', '', res) '4 5 6' # заменить ссылкой на группу >>> import re >>> date = r ' 2018-09-01 '>>> re.sub (r' ( d {4}) - ( d {2}) - ( d {2}) ', r' 2/ 3/ 1 /', date) '09/01/2018/' # верблюжий регистр для подчеркивания >>> def convert (s): ... res = re.sub (r '(.) ([AZ] [az] +)' , r ' 1_ 2', s) ... return re.sub (r '([az]) ([AZ])', r ' 1_ 2', res) .lower () ... >>> convert ('SentenceCase') 'scheme_case' >>> convert ('SentenceSentenceCase') 'scheme_sentence_case' >>> convert ('SampleExampleHTTPServer') 'sample_example_http _server '
Посмотрите вокруг:
обозначение | направление сравнения |
---|---|
(? | справа налево |
(? = …) | слева направо |
(?! | справа налево |
(?! …) | слева направо |
# basic >>> import re >>> re.sub ('(? = d {3})', '', '56789') '5 6 789' >>> re.sub ('(?! d {3}) ',' ',' 56789 ')' 567 8 9 '>>> re.sub (' (? >> re.sub (' (?
Соответствие обычному имени пользователя или паролю:
>>> import re >>> re.match ('^ [a-zA-Z0-9-_ ] {3,16} $ ',' Foo ') не NoneTrue >>> re.match (' ^ w | [-_] {3,16} $ ',' Foo ') не NoneTrue
Соответствие шестнадцатеричному значению цвета:
>>> import re >>> re.match ( '^ #? ([a-f0-9] {6} | [a-f0-9] {3}) $', '# ff0000') >>> re.match ( '^ #? ([a-f0-9] {6} | [a-f0-9] {3}) $', '# 000000')
Соответствие электронной почты:
> >> import re >>> re.match ('^ ([a-z0-9 _ .-] +) @ ([ da-z .-] +) . ([az .] {2, 6}) $ ',' [электронная почта защищена] ') # или >>> import re >>> example = re.compile (r '' '^ ([a-zA-Z0-9 ._% -] [электронная почта защищена] [a-zA-Z0-9 .-] + . [a-zA-Z] {2,4}) * $ '' ', re.X) >>> example.match ( '[электронная почта защищена]') >>> example.match ('citi% [email protected]')
Соответствующий URL:
>>> import re >>> example = re.compile (r '' '^ (https?: //)? # соответствует http или https ... ([ da- z .-] +) # соответствует домену ... . ([az .] {2,6}) # соответствует домену ... ([/ w .-] *) /? $ # сопоставить api или файл ... '' ', re.X) >>> example.match (' www.yahoo.com ') >>> example.match (' http://www.example ') >>> example.match (' http://www.example/w3r.html ') >>> example.match (' http://www.example/w3r ! .html ') >>> examplere.compile (' ^ (https?: \/\/)? n ([\ da-z \ .-] +) n \. ([az \.] {2,6}) n ([\/\ w \ .-] *) \/? $ N ', re.VERBOSE) sre.sre_match> sre. sre_match> sre. sre_match>
Соответствие IP-адресу:
обозначение | описание |
---|---|
[1]? [0-9] [0-9] | Соответствие шаблону 0-199 |
2 [0-4] [0-9] | Соответствие 200- 249 шаблон |
25 [0-5] | Соответствует 251-255 шаблону |
(?: …) | Не захватывать группу |
>>> import re >>> example = re.compile (r '' '^ (? :( ?: 25 [0-5] ... | 2 [0-4] [0-9 ] ... | [1]? [0-9] [0-9]?) .) {3} ... (?: 25 [0-5] ... | 2 [0-4] [ 0-9] ... | [1]? [0-9] [0-9]?) $ '' ', Re.X) >>> example.match (' 192.168.1.1 ') >>> example.match ('255.255.255.0') >>> example.match ('172.17.0.5') >>> пример .match ('256.0.0.0') is NoneTrue
Соответствует Mac-адресу:
>>> import random >>> mac = [random.randint (0x00, 0x6b), ... random.randint (0x00, 0x6b), ... случайный. randint (0x00, 0x6b), ... random.randint (0x00, 0x6b), ... random.randint (0x00, 0x6b), ... random.randint (0x00, 0x6b)] >>> mac = ': '.join (map (lambda x: "% 02x"% x, mac)) >>> mac'05: 38: 64: 60: 55: 63' >>> import re >>> example = re.compile ( r '' '[0-9a-f] {2} ([:]) ... [0-9a-f] {2} ... ( 1 [0-9a-f] {2}) { 4} $ '' ', re.X) >>> example.match (mac) не является NoneTrue
Lexer:
>>> import re >>> from collection import namedtuple >>> tokens = [r '(? P d +)', r '(? P +) ', r' (? P -) ', r' (? P *) ', r' (? P /) ', r' (? P s +) '] >>> lex = re.compile (' | '.join (tokens)) >>> Token = namedtuple (' Token ', [' type ',' value ']) >>> def tokenize ( text): scan = lex.scanner (text) return (Token (m.lastgroup, m.group ()) для m в iter (scan.match, None), если m.lastgroup! = 'WS') >>> для _t в tokenize ('9 + 5 * 2-7'): print (_t) Token (type = 'NUMBER', value = '9') Token (type = 'PLUS', value = '+') Token (type = 'NUMBER', value = '5') Token (type = 'TIMES', value = '*') Token (type = 'NUMBER', value = '2') Token ( type = 'MINUS', value = '-') Token (type = 'NUMBER', value = '7') >>> tokens ['(? P \ d +)', '(? P \ +) ',' (? P -) ',' (? P \ *) ',' (? P /) ',' (? P s +) ']
Проверьте свои навыки Python с помощью викторины w3resource