Регулярное выражение Python

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

Регулярное выражение (или 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 символам.

Либо экранирует специальные символы (позволяя вам сопоставлять такие символы, как ‘*’, ‘?’ И т. Д.) Или сигнализирует о специальной последовательности; специальные последовательности обсуждаются ниже.

[] Используется для обозначения набора символов. В наборе:
  • Символы могут быть перечислены индивидуально, например [amk] будет соответствовать ‘a’, ‘m’ или ‘k’.
  • Диапазоны символов можно указать, задав два символа и разделив их знаком ‘-‘, например [az ] будет соответствовать любой строчной букве ASCII, [0-5] [0-9] будет соответствовать всем двухзначным числам от 00 до 59, а [0-9A-Fa-f] будет соответствовать любой шестнадцатеричной цифре. Если — экранирован (например, [a -z]) или если он помещен в качестве первого или последнего символа (например, [-a] или [a-]), он будет соответствовать литералу ‘-‘.
  • Специальные символы теряют свое особое значение внутри наборов. Например, [(+ *)] будет соответствовать любому из буквальных символов ‘(‘, ‘+’, ‘*’ или ‘)’.
  • Классы символов, такие как w или S (определенные ниже) также принимаются внутри набора, хотя символы, которые они соответствуют, зависят от того, активен ли режим ASCII или LOCALE.
  • Символы, которые не входят в диапазон, могут быть сопоставлены путем дополнения набор. Если первый символ набора — ‘^’, все символы, которых нет в наборе, будут сопоставлены. Например, [^ 5] будет соответствовать любому символу, кроме ‘5’, а [^^] будет соответствовать любому символу, кроме ‘^’. ^ не имеет особого значения, если это не первый символ в наборе.
  • Чтобы сопоставить литерал ‘]’ внутри набора, поставьте перед ним обратную косую черту или поместите его в начало набора . Например, и [() [] {}], и [] () [{}] будут соответствовать круглой скобке.
| 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) (т. Е. Соответствует строке, заключенной в одинарные или двойные кавычки):

Контекст ссылки на группу «цитата» Способы ссылки на нее
в том же самом шаблоне
  • (? P = quote) (как показано)
  • 1
при обработке объекта соответствия m
  • m.group ( ‘цитата’)
  • m.end (‘цитата’) (и т. д.)
в строке, переданной в аргумент repl функции re. sub ()
  • g
  • g
  • 1
(? P = name) Обратная ссылка на названную группу; он соответствует любому тексту, соответствующему предыдущей группе с именем name. (? # …) Комментарий; содержимое круглых скобок просто игнорируется. (? = …) Соответствует, если … соответствует следующему, но не соответствует ‘ t потребляют любую строку. Это называется предварительным утверждением. Например, Isaac (? = Asimov) будет соответствовать ‘Isaac’, только если за ним следует ‘Asimov’. (?! …) Соответствует, если … не соответствует следующему. Это утверждение о негативном прогнозе. Например, Исаак (?! Азимов) будет соответствовать «Исаак», только если за ним не следует «Азимов». (?

Соответствует, если текущей позиции в строке предшествует совпадение для …, которое заканчивается в текущей позиции. Это называется утверждением положительного просмотра назад. (?

>>> import re >>> m = re.search ('(? >> m.group (0)' def '

В этом примере выполняется поиск слово после дефиса:

>>> m = re.search (r '(? >> m.group (0)' egg '
(? Соответствует, если текущей позиции в строке не предшествует совпадение для …. Это называется утверждение отрицательного просмотра назад. Подобно утверждениям положительного просмотра назад, содержащийся в нем шаблон должен соответствовать только строкам некоторой фиксированной длины. Шаблоны, которые начинаются с утверждений отрицательного просмотра назад, могут совпадать в начале строки, в которой выполняется поиск. (? (id/name) yes-pattern | no-pattern) Будет пытаться сопоставить с yes-шаблоном, если группа с данным идентификатором или именем существует , и без шаблона, если это не так. no-pattern является необязательным и может быть опущено. Например, ( | $) — плохой шаблон соответствия электронной почты, который будет соответствовать как «», так и «[email protected]», но не с « ‘. Специальные последовательности состоят из’ ‘и символа из списка ниже. Если обычный символ не является цифрой ASCII или буквой ASCII, то результирующий RE будет соответствовать второму символу. Например, $ соответствует символу ‘$’. number Соответствует содержимому группы одинаковых номер. Группы нумеруются, начиная с 1. Например, (. +) 1 соответствует ‘the’ или ’55 55 ‘, но не’ thethe ‘(обратите внимание на пробел после группы). Эта особая последовательность может использоваться только для соответствия одной из первых 99 групп.. Если первая цифра числа равна 0 или число состоит из 3 восьмеричных цифр, оно будет интерпретироваться не как групповое совпадение, а как символ с восьмеричным числом. Внутри ‘[‘ и ‘]’ класса символов все числовые экраны рассматриваются как символы. A Соответствует только началу строки. b

Соответствует пустой строке, но только в начале или в конце слова. Слово определяется как последовательность символов слова.

B Соответствует пустой строке, но только если она не находится в начале или конце слово. Это означает, что r’py B ‘соответствует’ python ‘,’ py3 ‘,’ py2 ‘, но не’ py ‘,’ py. ‘Или’ py! ‘. B — полная противоположность b, поэтому символы слова в шаблонах Unicode представляют собой буквенно-цифровые символы Unicode или знак подчеркивания, хотя это можно изменить с помощью флага ASCII. Границы слова определяются текущим языковым стандартом, если используется флаг LOCALE. d

Соответствует любой символ, являющийся цифрой. Эквивалентно [0-9]. Например,/ d/или/[0-9]/соответствует ‘2’ в «E2 означает второй пример».

D Соответствует любому символу, не являющемуся десятичной цифрой. Это противоположно d. Если используется флаг ASCII, он становится эквивалентом [^ 0-9] (но флаг влияет на все регулярное выражение, поэтому в таких случаях использование явного [^ 0-9] может быть лучшим выбором). s

Соответствует любому символу пробела (включая табуляцию, новую строку, возврат каретки, перевод страницы, вертикальный вкладка). [ t n r f v].
Например,/ s w */соответствует «яблоку» в «Яблоке».

Соответствует рассматриваемым символам пробел в наборе символов ASCII; это эквивалентно [ t n r f v].

S Соответствует любому символу, кроме символа пробела. Это противоположно s. Если используется флаг ASCII, он становится эквивалентом [^ t n r f v] (но флаг влияет на все регулярное выражение, поэтому в таких случаях используется явное [^ t n r f v] может быть лучшим выбором). w

Соответствует символам, считающимся буквенно-цифровыми в набор символов ASCII; это эквивалентно [a-zA-Z0-9_]. Если используется флаг LOCALE, сопоставляет символы, считающиеся буквенно-цифровыми в текущей локали, и подчеркивание.

W

Соответствует любому символу, не являющемуся словом, эквивалент [^ A-Za-z0-9_]. Например,/ W/или/[^ $ A-Za-z0-9 _]/соответствует ‘$’ в «150 $»

Z Соответствует только концу строки.

Сравните теги HTML:

тип тега формат пример
открытый тег
закрывающий тег [^>pting+> ,
самозакрытие ght+/>
все теги ]+> ,
  # открыть тег >>> 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

Оцените статью
nanomode.ru
Добавить комментарий