0% нашли этот документ полезным (0 голосов)
23 просмотров34 страницы

Pythonlearn 11 Regex

Загружено:

Nino Rcheulishvili
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PPTX, PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
23 просмотров34 страницы

Pythonlearn 11 Regex

Загружено:

Nino Rcheulishvili
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PPTX, PDF, TXT или читать онлайн в Scribd
Вы находитесь на странице: 1/ 34

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

Глава 11

Пайтон для всех


www.py4e.com
Регулярные выражения
В компьютерной терминологии «регулярное выражение» (его еще
называют regexp или regex, сокр. «регулярка») — мощное и гибкое
средство для сопоставления строк текста, например, определенных
символов, слов или наборов символов.
Регулярное выражение написано на формальном языке, который может
интерпретироваться обработчиком регулярных выражений

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

https://ru.wikipedia.org/wiki/Регулярные_выражения
«Умные» функции «Искать» / «Поиск»
О регулярных выражениях
• Очень мощные и немного загадочные
• Забавные, как только поймешь их
• Регулярные выражения сами по себе напоминают язык
программирования
• Пишутся с помощью специальных символов
• Компактные, это своего рода язык «старой школы»
http://xkcd.com/208/
Регулярные выражения: краткое руководство
^ Начало всего текста или начало строки текста
$ Конец всего текста или конец строки текста
. Один любой символ, кроме новой строки \n
\s Любой пробельный символ
\S Любой непробельный символ
* Повторяет символ ноль или более раз
*? Повторяет символ ноль или более раз (не жадный квантификатор)
+ Повторяет символ ноль или более раз
+? Повторяет символ ноль или более раз (не жадный квантификатор)
[aeiou] Любой из символов, перечисленных в наборе
[^XYZ] Любой символ, не указанный в данном наборе
[a-z0-9] Набор символов может включать диапазон
( Указывает начало извлечения строки
) Указывает конец извлечения строки

https://www.py4e.com/lectures3/Pythonlearn-11-Regex-Handout.txt
Модуль регулярных выражений
• Прежде чем вы сможете использовать в своей программе
регулярные выражения, необходимо импортировать библиотеку,
используя команду import re

• Используя re.search(), можно проверить, соответствует ли строка


регулярному выражению, аналогично использованию метода find()
для строк

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


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

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

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

Мы гибко настраиваем то, что нужно найти, добавляя специальные символы в строку
Метасимволы (символы-джокеры)
• Символ . (точка) означает один любой символ

• Символ * (звездочка) означает «ноль или более повторений»


Множество
Начало строки раз
X-Sieve: CMU Sieve 2.3
X-DSPAM-Result: Innocent
X-DSPAM-Confidence: 0.8475
X-Content-Type-Message-Body: text/plain
^X.*:
Любой символ
Тонкая настройка соответствия
В зависимости от «чистоты» данных и целей вашего приложения, вам
может понадобиться немного сузить диапазон соответствия

Множество
Начало строки раз
X-Sieve: CMU Sieve 2.3
X-DSPAM-Result: Innocent
X-Plane is behind schedule: two weeks
X-: Very short
^X.*:
Любой символ
Тонкая настройка соответствия
В зависимости от «чистоты» данных и целей вашего приложения, вам
может понадобиться немного сузить диапазон соответствия

Один или
X-Sieve: CMU Sieve 2.3 Начало строки более раз
X-DSPAM-Result: Innocent
X-: Very Short
X-Plane is behind schedule: two weeks ^X-\S+:
Любой непробельный символ
Сопоставление и извлечение данных
• re.search() возвращает значение True/False в зависимости от того,
соответствует ли строка регулярному выражению

• Если необходимо извлечь совпадающие строки, используем


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

цифр
Сопоставление и извлечение данных
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)
[]
Осторожно: Жадные квантификаторы
Квантификаторы (* и +) называют «жадными», так как в некоторых реализациях
регулярным выражениям с ними соответствует максимально длинная строка из
возможных
Один или более
символов
>>> import re
>>> x = 'From: Using the : character'
>>> y = re.findall('^F.+:', x)
>>> print(y) ^F.+:
['From: Using the :']

Почему не просто Первый символ Последний символ


'From:' ? совпадения - буква F совпадения - :
Ленивые квантификаторы
Но не все квантификаторы регулярных выражений жадные!
Добавьте символ ?, это немного охладит пыл + и *...
Один или более
символов, но
минимально
возможное
>>> import re количество
>>> x = 'From: Using the : character' ^F.+?:
>>> y = re.findall('^F.+?:', x)
>>> print(y)
['From:'] Первый символ Последний символ
совпадения - буква F совпадения - :
Тонкая настройка извлечения строк
Вы можете точнее настроить поиск совпадения для re.findall() и отдельно
указать, какая часть совпадения должна быть извлечена, используя круглые
скобки

From [email protected] Sat Jan 5 09:14:16 2008

>>> y = re.findall('\S+@\S+',x) \S+@\S+


>>> print(y)
['[email protected]’]
Как минимум
один
непробельный
символ
Тонкая настройка извлечения строк
Круглые скобки не являются частью совпадения, они лишь сообщают,
где начинается и заканчивается извлечение строки

From [email protected] Sat Jan 5 09:14:16 2008

>>> y = re.findall('\S+@\S+',x)
>>> print(y)
['[email protected]']
^From (\S+@\S+)
>>> y = re.findall('^From (\S+@\S+)',x)
>>> print(y)
['[email protected]']
Примеры анализа строк
21 31

From [email protected] Sat Jan 5 09:14:16 2008

>>> data = 'From [email protected] 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] метод find и срез
>>> print(host)
uct.ac.za
строки
Шаблон двойного разделения
Иногда бывает необходимо сначала разделить строку одним
образом, а затем взять один из получившихся кусков и
разделить его ещё раз
From [email protected] Sat Jan 5 09:14:16 2008

words = line.split() [email protected]


email = words[1] ['stephen.marquard', 'uct.ac.za']
pieces = email.split('@')
print(pieces[1]) 'uct.ac.za'
Версия с регулярным выражением
From [email protected] Sat Jan 5 09:14:16 2008
import re
lin = 'From [email protected] Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)

['uct.ac.za']
'@([^ ]*)'

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


Версия с регулярным выражением
From [email protected] Sat Jan 5 09:14:16 2008
import re
lin = 'From [email protected] Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)

['uct.ac.za']
'@([^ ]*)'
Ноль или более
Захватить непробельные
символов
символы
Версия с регулярным выражением
From [email protected] Sat Jan 5 09:14:16 2008
import re
lin = 'From [email protected] Sat Jan 5 09:14:16 2008'
y = re.findall('@([^ ]*)',lin)
print(y)

['uct.ac.za']
'@([^ ]*)'

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


Сделаем еще круче
From [email protected] Sat Jan 5 09:14:16 2008
import re
lin = 'From [email protected] Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]*)'

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


Сделаем еще круче
From [email protected] Sat Jan 5 09:14:16 2008
import re
lin = 'From [email protected] Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]*)'

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


Сделаем еще круче
From [email protected] Sat Jan 5 09:14:16 2008
import re
lin = 'From [email protected] Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]*)'

Начало извлечения
Сделаем еще круче
From [email protected] Sat Jan 5 09:14:16 2008
import re
lin = 'From [email protected] Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]+)'

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


символы можно больше
Сделаем еще круче
From [email protected] Sat Jan 5 09:14:16 2008
import re
lin = 'From [email protected] Sat Jan 5 09:14:16 2008'
y = re.findall('^From .*@([^ ]*)',lin)
print(y)

['uct.ac.za']
'^From .*@([^ ]+)'

Конец извлечения
Проверка на спам
import re
hand = open('mbox-short.txt')
numlist = list()
for line in hand:
line = line.rstrip()
stuff = re.findall('^X-DSPAM-Confidence: ([0-9.]+)', line)
if len(stuff) != 1 : continue
num = float(stuff[0])
numlist.append(num)
print('Maximum:', max(numlist)) python ds.py
Maximum: 0.9907
X-DSPAM-Confidence: 0.8475
Экранирование символа
Чтобы отменить (экранировать) специальное значение символа
регулярного выражения, поставьте перед ним обратную косую
черту '\'
Один или
>>> import re
>>> x = 'Мы только что получили $10.00 за печенье.' более
>>> y = re.findall('\$[0-9.]+',x)
>>> print(y)
['$10.00'] \$[0-9.]+
Знак доллара Число или точка
Резюме
• Регулярные выражения — загадочный, но очень мощный язык
для сопоставления строк и извлечения элементов из этих строк
• Регулярные выражения содержат специальные символы,
которые являются управляющими конструкциями
Авторы / Благодарности
… Insert new Contributors and Translations here
...
Авторские права на эти слайды принадлежат Чарльзу Р.
Северансу (www.dr-chuck.com) , 2010 г., Школе Информации
Мичиганского Университета и open.umich.edu , и доступны по
лицензии Creative Commons Attribution 4.0 License.
Пожалуйста, сохраняйте этот слайд во всех копиях этого
документа, в соответствии с требованиями Лицензии. Если
вы внесли изменения, добавьте свое имя или организацию в
список участников на этой странице.

Исходная разработка: Чарльз Северанс, Школа


Информации Мичиганского Университета.

Перевод выполнила Фомкина Виолетта.

… Добавьте сюда новых авторов и переводчиков

Вам также может понравиться