Регулярните изрази са концепция, използвана за търсене на модели в низов текст.
https://www.activestate.com/wp-content/uploads/2020/03/Python-RegEx-Cheatsheet.pdf
Това е универсална концепция за всеки език за програмиране или програма за редактиране на текст.
Целта на регулярните изрази е да могат да търсят конкретен тип текст вътре в низ. Ако имаме формуляр на нашата уеб страница, където искаме имейл адреси, можем ли да проверим дали въведеният низ действително следва формата на имейл? някои букви, цифри или специални знаци, след това знак @, след това още няколко букви, числа или специални знаци, след това . след това още няколко букви.
Ключове за RegEx
. - Any Character Except New Line \d - Digit (0-9) \D - Not a Digit (0-9) \w - Word Character (a-z, A-Z, 0-9, _) \W - Not a Word Character \s - Whitespace (space, tab, newline) \S - Not Whitespace (space, tab, newline) \b - Word Boundary \B - Not a Word Boundary ^ - Beginning of a String $ - End of a String [] - Matches Characters in brackets [^ ] - Matches Characters NOT in brackets | - Either Or ( ) - Group Quantifiers: * - 0 or More + - 1 or More ? - 0 or One {3} - Exact Number {3,4} - Range of Numbers (Minimum, Maximum)
Импортиране на reбиблиотеки:
import re text_to_search = ''' abcdefghijklmnopqurtuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 123abc Hello HelloHello MetaCharacters (Need to be escaped): . ^ $ * + ? { } [ ] \ | ( ) gmail.com 321-555-4321 123.555.1234 [email protected] Mr. Johnson Mr Smith Ms Davis Mrs. Robinson Mr. T '''
Търсене на литерали
pattern = re.compile(r'cba') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) Output: Will search for the literals 'cba' in the text.
Търсене на специални знаци
Различни специални знаци:
Квадратни скоби []
Квадратните скоби се използват за указване на набор от знаци — поне един от които трябва да съвпада, но не повече от един, освен ако не е указано друго.
Пример: Malwareb[yi]es ще съответстват на Malwarebytes и Malwarebites, а не на Malwarebyites.
Знакът минус –
Знакът минус или тире се използва за указване на диапазон от знаци.
Пример: [0–9] ще бъде съвпадение за всеки единичен цифра между 0 и 9.
Къдрави скоби {}
Къдравите скоби се използват за количествено определяне на броя знаци.
Пример: [0–9]{3} съвпада с произволна числова последователност между 000 и 999
Скоби ()
Скобите се използват за групиране на знаци. Съвпаденията съдържат знаците в техния точен ред.
Пример: (са) дава съвпадение за злонамерен софтуер, но не и за антена, тъй като следният ред на знаците е различен от спецификацията.
Наклонена черта |
Наклонената черта, както в много езици, означава логическия оператор „или“.
Пример: Most|more ще съответства и на двете определени думи.
Точка .
Точката или точката действат като заместващ знак. Съвпада с всеки отделен знак, с изключение на знаците за прекъсване на ред.
Пример: Malwareb.tes ще съответства на Malwarebytes, Malwarebites, Malwarebotes и много други, но все още не и на Malwarebyites.
Наклонена черта \
Обратната наклонена черта се използва за избягване на специални знаци и за придаване на специално значение на някои знаци, които го следват.
Примери: \d съвпада с едно цяло число (0–9).
\w съвпада с един буквено-цифров знак.
Звездичка *
Звездичката е повторител. Съвпада, когато знакът пред него съвпада 0 или повече пъти.
Пример: cho*se ще съвпада за chose и choose, но също и за chse (нулево съвпадение).
Звездичка и точка .*
Звездичката се използва в комбинация с точката за съвпадение на всеки знак 0 или повече пъти.
Пример : Злонамерен софтуер.* ще съответства на Зловреден софтуер, Malwarebytes и всяка грешно изписана версия, която започва със Зловреден софтуер.
Знак плюс +
Знакът плюс съвпада, когато знакът пред + съвпада 1 или повече пъти.
Пример: cho+se ще съвпада за chose и select, но не за chse.
pattern = re.compile(r'.') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) Output: Any Character Except New Line pattern = re.compile(r'\.') matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Изход: Всички знаци ‘.’
‹re.Match обект; span=(129, 130), match=’.’›
‹re.Match обект; span=(163, 164), match=’.’›
‹re.Match обект; span=(185, 186), match=’.’›
‹re.Match обект; span=(189, 190), match=’.’›
‹re.Match обект; span=(211, 212), match=’.’›
‹re.Match обект; span=(219, 220), match=’.’›
‹re.Match обект; span=(250, 251), match=’.’›
‹re.Match обект; span=(263, 264), match=’.’›
pattern = re.compile(r'\D') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'\d\w') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'\d\s') matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Граница на думите
# Hello HelloHello pattern = re.compile(r'Hello') #searching for 'Hello' matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Изход:
<re.Match object; span=(74, 79), match='Hello'> <re.Match object; span=(80, 85), match='Hello'> <re.Match object; span=(85, 90), match='Hello'> pattern = re.compile(r'Hello\b') #Word Boundary matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Изход:
<re.Match object; span=(74, 79), match=’Hello’> <re.Match object; span=(85, 90), match=’Hello’> Note: Here we searched for the pattern were 'Hello' was followed by word boundary(space/new line etc.) pattern = re.compile(r'\bHello\b') matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Изход:
<re.Match object; span=(74, 79), match='Hello'> Other Worth trying examples: pattern = re.compile(r'\BHello\b') # \B - Not word boundary matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'\b\d') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'^\s') #Whitespace (space, tab, newline) at beginning of string matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Набори от знаци
pattern = re.compile(r'[123]\w') matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Изход:
<re.Match object; span=(55, 57), match='12'> <re.Match object; span=(57, 59), match='34'> <re.Match object; span=(66, 68), match='12'> <re.Match object; span=(68, 70), match='3a'> <re.Match object; span=(169, 171), match='32'> <re.Match object; span=(178, 180), match='32'> <re.Match object; span=(182, 184), match='12'> <re.Match object; span=(190, 192), match='12'> <re.Match object; span=(192, 194), match='34'> pattern = re.compile(r'[a-z][a-z]') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'[a-zA-Z0-9][a-zA-z-]') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'[a-zA-Z][^a-zA-z]') matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Групи знаци
pattern = re.compile(r'(abc|com|texas)\b') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'([A-Z]|llo)[a-zA-z]') matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Квантори
pattern = re.compile(r'Mr\.?\s[A-Z]') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'Mr\.?\s[A-Z][a-z]*') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'M(s|rs)\.?\s[A-Z][a-z]*') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'\d{3}[.-]\d{3}[.-]\d{4}') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'[a-zA-Z0-9_]+\.[a-z]{3}') matches = pattern.finditer(text_to_search) for mat in matches: print(mat) pattern = re.compile(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+') matches = pattern.finditer(text_to_search) for mat in matches: print(mat)
Достъп до информация в обекта Match
pattern = re.compile(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]{2,4}') matches = pattern.finditer(text_to_search) for mat in matches: print(mat.span(0)) print(mat.group(0)) print(text_to_search[mat.span(0)[0]:mat.span(0)[1]]) urls = r''' https://www.google.com http://yahoo.com https://www.whitehouse.gov https://craigslist.org ''' pattern = re.compile(r'https?://(www\.)?\w+\.\w+') matches = pattern.finditer(urls) for mat in matches: print(mat) pattern = re.compile(r'https?://(www\.)?(\w+)(\.\w+)') matches = pattern.finditer(urls) for mat in matches: print(mat.group(2)+mat.group(3)) pattern = re.compile(r'https?://(www\.)?(\w+)(\.\w+)') matches = pattern.finditer(urls) for mat in matches: print(mat.group(0)) print(urls[mat.span(2)[0]:mat.span(2)[1]]+urls[mat.span(3)[0]:mat.span(3)[1]])