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

Содержание

Слайд 2

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

https://ru.wikipedia.org/wiki/Регулярные_выражения

В компьютерной терминологии «регулярное выражение» (его еще называют regexp или regex,

Регулярные выражения https://ru.wikipedia.org/wiki/Регулярные_выражения В компьютерной терминологии «регулярное выражение» (его еще называют regexp
сокр. «регулярка») — мощное и гибкое средство для сопоставления строк текста, например, определенных символов, слов или наборов символов.
Регулярное выражение написано на формальном языке, который может интерпретироваться обработчиком регулярных выражений

Слайд 3

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

Умный подход к анализу и сопоставлению строк, основанный на использовании метасимволов

https://ru.wikipedia.org/wiki/Регулярные_выражения

Регулярные выражения Умный подход к анализу и сопоставлению строк, основанный на использовании метасимволов https://ru.wikipedia.org/wiki/Регулярные_выражения

Слайд 4

О регулярных выражениях

Очень мощные
Регулярные выражения сами по себе напоминают язык программирования
Пишутся с

О регулярных выражениях Очень мощные Регулярные выражения сами по себе напоминают язык
помощью специальных символов

Слайд 5

Регулярные выражения: краткое руководство

^ Начало всего текста или начало строки текста
$ Конец

Регулярные выражения: краткое руководство ^ Начало всего текста или начало строки текста
всего текста или конец строки текста
. Один любой символ, кроме новой строки \n
\s Любой пробельный символ
\S Любой непробельный символ
* Повторяет символ ноль или более раз
*? Повторяет символ ноль или более раз (не жадный квантификатор)
+ Повторяет символ ноль или более раз
+? Повторяет символ ноль или более раз (не жадный квантификатор)
[aeiou] Любой из символов, перечисленных в наборе
[^XYZ] Любой символ, не указанный в данном наборе
[a-z0-9] Набор символов может включать диапазон
( Указывает начало извлечения строки
) Указывает конец извлечения строки

Слайд 6

Модуль регулярных выражений

Прежде чем вы сможете использовать в своей программе регулярные выражения,

Модуль регулярных выражений Прежде чем вы сможете использовать в своей программе регулярные
необходимо импортировать библиотеку, используя команду import re
Используя re.search(), можно проверить, соответствует ли строка регулярному выражению, аналогично использованию метода find() для строк
Вы можете использовать re.findall() для извлечения частей строки, которые соответствуют регулярному выражению, аналогично комбинации метода find() и среза: var[5:10]

Слайд 7

Использование re.search(), как find()

import re
hand = open('mbox-short.txt')
for line in hand:
line =

Использование re.search(), как find() import re hand = open('mbox-short.txt') for line in
line.rstrip()
if re.search('From:', line) :
print(line)

hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if line.find('From:') >= 0:
print(line)

Слайд 8

Использование re.search(), как startswith()

import re
hand = open('mbox-short.txt')
for line in hand:
line =

Использование re.search(), как startswith() import re hand = open('mbox-short.txt') for line in
line.rstrip()
if re.search('^From:', line) :
print(line)

hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if line.startswith('From:') :
print(line)

Мы гибко настраиваем то, что нужно найти, добавляя специальные символы в строку

Слайд 9

Метасимволы

Символ . (точка) означает один любой символ
Символ * (звездочка) означает «ноль или

Метасимволы Символ . (точка) означает один любой символ Символ * (звездочка) означает
более повторений»

X-Sieve: CMU Sieve 2.3
X-DSPAM-Result: Innocent
X-DSPAM-Confidence: 0.8475
X-Content-Type-Message-Body: text/plain

^X.*:

Начало строки

Любой символ

Множество раз

Слайд 10

Тонкая настройка соответствия

В зависимости от «чистоты» данных и целей вашего приложения, вам

Тонкая настройка соответствия В зависимости от «чистоты» данных и целей вашего приложения,
может понадобиться немного сузить диапазон соответствия

X-Sieve: CMU Sieve 2.3
X-DSPAM-Result: Innocent
X-Plane is behind schedule: two weeks
X-: Very short

^X.*:

Начало строки

Любой символ

Множество раз

Слайд 11

Тонкая настройка соответствия

В зависимости от «чистоты» данных и целей вашего приложения, вам

Тонкая настройка соответствия В зависимости от «чистоты» данных и целей вашего приложения,
может понадобиться немного сузить диапазон соответствия

X-Sieve: CMU Sieve 2.3
X-DSPAM-Result: Innocent
X-: Very Short
X-Plane is behind schedule: two weeks

^X-\S+:

Начало строки

Любой непробельный символ

Один или более раз

Слайд 12

Сопоставление и извлечение данных

re.search() возвращает значение True/False в зависимости от того, соответствует

Сопоставление и извлечение данных re.search() возвращает значение True/False в зависимости от того,
ли строка регулярному выражению
Если необходимо извлечь совпадающие строки, используем re.findall()

>>> import re
>>> x = '2 моих любимых числа - 19 и 42'
>>> y = re.findall('[0-9]+',x)
>>> print(y)
['2', '19', '42']

[0-9]+

Одна или более цифр

Слайд 13

Сопоставление и извлечение данных

re.findall() возвращает список из нуля или более подстрок, соответствующих

Сопоставление и извлечение данных re.findall() возвращает список из нуля или более подстрок,
регулярному выражению

>>> import re
>>> x = '2 моих любимых числа - 19 и 42'
>>> y = re.findall('[0-9]+',x)
>>> print(y)
['2', '19', '42']
>>> y = re.findall('[AEIOU]+',x)
>>> print(y)
[]

Слайд 14

Жадные квантификаторы

Квантификаторы (* и +) называют «жадными», так как в некоторых реализациях

Жадные квантификаторы Квантификаторы (* и +) называют «жадными», так как в некоторых
регулярным выражениям с ними соответствует максимально длинная строка из возможных

>>> import re
>>> x = 'From: Using the : character'
>>> y = re.findall('^F.+:', x)
>>> print(y)
['From: Using the :']

^F.+:

Один или более символов

Первый символ совпадения - буква F

Последний символ совпадения - :

Почему не просто 'From:' ?

Слайд 15

Ленивые квантификаторы

Но не все квантификаторы регулярных выражений жадные!
Добавьте символ ?, это немного

Ленивые квантификаторы Но не все квантификаторы регулярных выражений жадные! Добавьте символ ?,
охладит пыл + и *...

>>> import re
>>> x = 'From: Using the : character'
>>> y = re.findall('^F.+?:', x)
>>> print(y)
['From:']

^F.+?:

Один или более символов, но минимально возможное количество

Первый символ совпадения - буква F

Последний символ совпадения - :

Слайд 16

Тонкая настройка извлечения строк

Вы можете точнее настроить поиск совпадения для re.findall() и

Тонкая настройка извлечения строк Вы можете точнее настроить поиск совпадения для re.findall()
отдельно указать, какая часть совпадения должна быть извлечена, используя круглые скобки

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

>>> y = re.findall('\S+@\S+',x)
>>> print(y)
['stephen.marquard@uct.ac.za’]

\S+@\S+

Как минимум один непробельный символ

Слайд 17

Тонкая настройка извлечения строк

Круглые скобки не являются частью совпадения, они лишь сообщают,

Тонкая настройка извлечения строк Круглые скобки не являются частью совпадения, они лишь
где начинается и заканчивается извлечение строки

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

^From (\S+@\S+)

>>> y = re.findall('\S+@\S+',x)
>>> print(y)
['stephen.marquard@uct.ac.za']
>>> y = re.findall('^From (\S+@\S+)',x)
>>> print(y)
['stephen.marquard@uct.ac.za']

Слайд 18

Примеры анализа строк

Примеры анализа строк

Слайд 19

>>> data = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
>>> atpos =

>>> data = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008' >>> atpos
data.find('@')
>>> print(atpos)
21
>>> sppos = data.find(' ',atpos)
>>> print(sppos)
31
>>> host = data[atpos+1 : sppos]
>>> print(host)
uct.ac.za

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

21

31

Извлечение имени хоста, используя метод find и срез строки

Слайд 20

Шаблон двойного разделения

Иногда бывает необходимо сначала разделить строку одним образом, а затем

Шаблон двойного разделения Иногда бывает необходимо сначала разделить строку одним образом, а
взять один из получившихся кусков и разделить его ещё раз

['stephen.marquard', 'uct.ac.za']

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

words = line.split()
email = words[1]
pieces = email.split('@')
print(pieces[1])

stephen.marquard@uct.ac.za

'uct.ac.za'

Слайд 21

'@([^ ]*)'

Просматривать строку пока не встретится символ @

From stephen.marquard@uct.ac.za Sat Jan 5

'@([^ ]*)' Просматривать строку пока не встретится символ @ From stephen.marquard@uct.ac.za Sat
09:14:16 2008

import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)
['uct.ac.za']

Версия с регулярным выражением

Слайд 22

Версия с регулярным выражением

'@([^ ]*)'

Захватить непробельные символы

Ноль или более символов

import re

Версия с регулярным выражением '@([^ ]*)' Захватить непробельные символы Ноль или более

lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)
['uct.ac.za']

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

Слайд 23

Версия с регулярным выражением

'@([^ ]*)'

Извлечь непробельные символы

From stephen.marquard@uct.ac.za Sat Jan 5

Версия с регулярным выражением '@([^ ]*)' Извлечь непробельные символы From stephen.marquard@uct.ac.za Sat
09:14:16 2008

import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)
['uct.ac.za']

Слайд 24

Или так…

'^From .*@([^ ]*)'

Начиная с начала строки, ищем подстроку 'From '

From

Или так… '^From .*@([^ ]*)' Начиная с начала строки, ищем подстроку 'From
stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)
['uct.ac.za']

Слайд 25

Или так…

'^From .*@([^ ]*)'

Пропустим часть символов, пока не встретим символ @

import re

Или так… '^From .*@([^ ]*)' Пропустим часть символов, пока не встретим символ

lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)
['uct.ac.za']

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

Слайд 26

Или так…

'^From .*@([^ ]*)'

Начало извлечения

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

import re

Или так… '^From .*@([^ ]*)' Начало извлечения From stephen.marquard@uct.ac.za Sat Jan 5

lin = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)
['uct.ac.za']

Слайд 27

Или так…

'^From .*@([^ ]+)'

Захватить непробельные символы

Захватить их как можно больше

import re
lin

Или так… '^From .*@([^ ]+)' Захватить непробельные символы Захватить их как можно
= 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)
['uct.ac.za']

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

Слайд 28

Или так…

'^From .*@([^ ]+)'

Конец извлечения

import re
lin = 'From stephen.marquard@uct.ac.za Sat Jan

Или так… '^From .*@([^ ]+)' Конец извлечения import re lin = 'From
5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)
['uct.ac.za']

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008