Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Нахождение всех вхождений шаблона




Нахождение всех вхождений шаблона

Первая вещь, которую делает эта программа — это находит все слова (в оригинале — буквы, так как ищет она именно буквы, прим. перев) в головоломке.

> > > import re
> > > re. findall('[0-9]+', '16 2-by-4s in rows of 8') ①
['16', '2', '4', '8']
> > > re. findall('[A-Z]+', 'SEND + MORE == MONEY') ②
['SEND', 'MORE', 'MONEY']

① Модуль re реализует регулярные выражения в Питоне. В этом модуле есть удобная функция findall(), которая принимает в качестве параметров шаблон регулярного выражения и строку, и находит все подстроки, соответствующие шаблону. В этом случае шаблон соответствует последовательностям цифр. Функция findall() возвращает список всех подстрок, представляющих последовательность цифр.

② Здесь регулярное выражение соответствует последовательностям букв. И снова возвращаемое значение представляет собой список, каждый элемент которого — это строка, соответствующая шаблону регулярного выражения.

Это самая трудная скороговорка на английском языке.

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

> > > re. findall(' s. *? s', " The sixth sick sheikh's sixth sheep's sick. " )
[' sixth s', " sheikh's s", " sheep's s" ]

Удивлены? Приведенное регулярное выражение ищет пробел, за которым следуют буква s, кратчайшая возможная последовательность любых символов (. *? ), пробел и еще одна буква s.

  1. The sixth s ick sheikh’s sixth sheep’s sick.
  2. The sixth sick s heikh’s sixth sheep’s sick.
  3. The sixth sick sheikh’s s ixth sheep’s sick.
  4. The sixth sick sheikh’s sixth s heep’s sick.
  5. The sixth sick sheikh’s sixth sheep’s s ick.

Но функция re. findall() находит только три вхождения: первое, третье и пятое. Почему так? Потому что она не возвращает перекрывающиеся подстроки. Первая подстрока перекрывается со второй, поэтому и возвращается только первая строка, а вторая пропускается. Затем третья подстрока перекрывается с четвертой, поэтому возвращается только третья подстрока, а четвертая пропускается. Наконец возвращается пятая подстрока. Три совпадения, а не пять.

Это не имеет никакого отношения к решению криптарифмов, я просто подумал, что это интересно.

Нахождение уникальных элементов в последовательностях

Множества делают задачу нахождения уникальных элементов в последовательности тривиальной.

> > > a_list = ['The', 'sixth', 'sick', " sheik's", 'sixth', " sheep's", 'sick']
> > > set(a_list) ①
{'sixth', 'The', " sheep's", 'sick', " sheik's" }
> > > a_string = 'EAST IS EAST'
> > > set(a_string) ②
{'A', ' ', 'E', 'I', 'S', 'T'}
> > > words = ['SEND', 'MORE', 'MONEY']
> > > ''. join(words) ③
'SENDMOREMONEY'
> > > set(''. join(words)) ④
{'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}


① Получив список из нескольких строк, функция set() вернет множество уникальных строк из этого списка. Работа этой функции будет более понятной, если вы представите цикл for. Возьмите первый элемент из списка и добавьте его в множество. Второй. Третий. Четвертый. Пятый — постойте-ка, он уже есть в множестве, поэтому его не нужно добавлять, потому что множества в Питоне не позволяют иметь повторяющиеся элементы. Шестой. Седьмой — снова дубликат, пропускаем его. Каков результат? Все уникальные элементы исходного списка без дубликатов. Исходный список даже сортировать предварительно не нужно.

② Тот же подход работает и если функции set() передать строку, а не список, поскольку строка — это просто последовательность символов.

③ Получив список строк, функция . join(a_list) объединяет все эти строки в одну.

④ Этот фрагмент кода, получив список строк, возвращает все уникальные символы, встречающиеся во всех строках.

Наша программа для решения криптарифмов использует эту технику для получения множества всех уникальных букв, используемых в головоломке.

unique_characters = set(''. join(words))

 

Проверка выполнения условий

Like many programming languages, Python has an assert statement. Here’s how it works.

Подобно многим языкам программирования, Python имеет оператор подтверждения отсутствия ошибок. Вот как он работает.

> > > assert 1 + 1 == 2 ①
> > > assert 1 + 1 == 3 ②
Traceback (most recent call last):
File " < stdin> ", line 1, in < module>
AssertionError
> > > assert 2 + 2 == 5, " Only for very large values of 2" ③
Traceback (most recent call last):
File " < stdin> ", line 1, in < module>
AssertionError: Only for very large values of 2


① За словом assert следует любое допустимое в Питоне выражение. В данном случае, выражение 1 + 1 == 2 возвращает значение True, поэтому assert ничего не делает.

② Однако если выражение возвращает False, assert выбрасывает исключение.

③ Вы также можете добавить информативное сообщение, которое будет выведено при возбуждении исключения AssertionError.

Поэтому, эта строка кода

assert len(unique_characters) < = 10, 'Too many letters'

эквивалентна

if len(unique_characters) > 10:
raise AssertionError('Too many letters')


Программа для решения криптарифмов использует именно это выражение для того чтобы прекратить выполнение если в головоломке содержится более десяти уникальных букв. Поскольку каждая буква соответствует цифре, а цифр всего десять, головоломка с более чем десятью уникальными буквами не может иметь решения.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...