Статья Автор: Прохоров Михаил

Решаем 24 задание:)

РЕГУЛЯРКИ!!!

1. Текстовый файл содержит только буквы A, C, D, F, O.
Определите максимальное количество идущих подряд групп символов вида
согласная + согласная + гласная.



1) строки не пересекаются => однозначное нахождение (не нужна конструкция (?=pattern))
2) [AO][HI] соотвествует всем парам AH OH AI OI
3) (?: ) - делает объединение
4) + повторяет предыдущее от 1 до ... раз (в данном случае объединение)

2. Текстовый файл содержит только буквы A, C, D, F, O.
Определите длину самой длинной цепочки символов, которая начинается и заканчивается буквой F,
а между двумя последовательными буквами F содержит не более двух букв A и произвольное количество других букв.


3. ((\w)\2{2,}) соответствует 3 или более последовательным символам

(\w) соответствует любому буквенно-цифровому символу.

((\w)\2) соответствует любому буквенно-цифровому символу, за которым следует тот же символ, поскольку \2 соответствует содержимому группы № 2. Поскольку я вложил скобки, группа № 2 относится к символу, которому соответствует \w.

Таким образом, ((\w)\2{2,}) соответствует любому буквенно-цифровому символу, за которым следует тот же символ, повторяющийся 2 или более раз.

В общем, это означает, что регулярное выражение требует, чтобы символ повторялся 3 или более раз.
4. Шифровка содержит только заглавные буквы латинского алфавита (ABC…Z).
Группа из трёх идущих подряд символов, содержащая по одному разу каждую из букв A, B и C, считается разделителем. Разделители могут накладываться друг на друга, например, последовательность символов BCABC считается идущими подряд разделителями BCA, CAB и ABC.
При дешифровке разделители удаляются, разбивая шифровку на фрагменты.
Определите количество символов в самом длинном фрагменте шифровки, полученном после удаления разделителей.
Пример
Пусть шифровка содержит такие символы: BADCBACKLMENBCAAA.
Разделители в этой строке выделены жирным шрифтом. Шифровка содержит три фрагмента: BAD, KLMEN и AA.
Самый длинный из них содержит 5 символов, в ответе в данном примере надо записать число 5.



5. Текстовый файл содержит только заглавные буквы латинского алфавита (ABC…Z).
Определите максимальное количество идущих подряд символов,
среди которых ровно по одному разу встречаются буквы A и B.


6. Текстовый файл содержит только заглавные буквы латинского алфавита (ABC…Z).
Определите максимальное количество идущих подряд символов,
среди которых каждая из букв A и B встречается не более двух раз.


7. Текстовый файл содержит только заглавные буквы латинского алфавита (ABC…Z).
Определите максимальную длину непрерывного фрагмента, который
начинается и заканчивается одной и той же буквой из первой половины алфавита (от A до M) и не содержит эту букву внутри.


8.  Текстовый файл состоит из цифр от 1 до 6, знаков операций «–» и «*» (вычитание и умножение) и заглавных латинских букв A, B, C, D.
Определите максимальное количество символов в непрерывной последовательности символов, состоящей из буквы A, за которой следует корректное арифметическое выражение с целыми неотрицательными числами, записанными в десятичной системе счисления.


9. Задание выполняется с использованием прилагаемых файлов.

Текстовый файл состоит из

  • цифр от 1 до 9,
  • знаков операций «+», «–» и «*» (сложение, вычитание и умножение)
  • и заглавных латинских букв A, B, C, D.

Назовём правильной суммой строку, содержащую последовательность из одного или более десятичных чисел, в которой между соседними числами стоит ровно один знак «+» и нет других знаков.

Примеры правильных сумм: «23», «115+6», «1980+12+12351».

Назовём результатом правильной суммы число, которое получится при выполнении записанных в соответствующей строке сложений.

Например, результат правильной суммы «2+3» – число 5.

Найдите в данной строке правильную сумму, расположенную непосредственно после буквы A и имеющую наибольший результат.
В ответе запишите результат найденной суммы. Гарантируется, что ответ не превышает 2·109.



10. Текстовый файл состоит из
  • цифр от 1 до 9,
  • знаков операций «+», «–» и «*» (сложение, вычитание и умножение)
  • и заглавных латинских букв A, B, C, D.

Назовём правильной суммой строку, содержащую последовательность из одного или более десятичных чисел, в которой между соседними числами стоит ровно один знак «+» или «–» и нет других знаков.

Примеры правильных сумм: «23», «115+6», «1980+12-123-51+3».

Назовём результатом правильной суммы число, которое получится при выполнении записанных в соответствующей строке действий..

Например, результат правильной суммы «2+3» – число 5, а результат правильной суммы «1+2–8+3» – число –2.

Найдите в данной строке расположенную непосредственно после буквы A правильную сумму, содержащую наибольшее число символов, и вычислите её результат.
Если несколько правильных сумм содержат одинаковое наибольшее число символов, выберите ту, которая имеет больший результат
В ответе запишите результат найденной суммы. Гарантируется, что ответ не превышает 2·109.



Всё про 24 номер ЕГЭ инфа:
Откуда:
https://vkvideo.ru/video-205865487_456240469?t=29m59s
https://vk.com/video-184870282_456257255
https://vk.com/video-205865487_456239724
https://vkvideo.ru/video-205865487_456239725?ref_domain=yastatic.net

https://colab.research.google.com/drive/1dVP0unQlHtybjqh7xOJeqZDpq9SYBZlX#scrollTo=e4b9eda5
Насчет регулярок:
1)Используем библиотеку re
2)Пример использования sub.
3) конструкция (?:pattern) - только нужные символы возращаются
конструкция (?=зфееукт) - поиск всех возможных
4) Пример использования findall().
1. ЗАМЕНА ОБЫЧНАЯ
Текстовый файл состоит не более чем из 1200000 символов, которые являются прописными буквами латинского алфавита. Определите максимальное количество идущих подряд символов, среди которых нет символов G, W, P.

s = open('').readline()
s = sub('[GWD]', ' ', s)
print(max(map(len, s.split())))

2. ЗАМЕНА ПАРНАЯ ОДИНАКОВЫХ БУКВ
Текстовый файл состоит из символов P, Q, R и S.
Определите максимальное количество идущих подряд символов в прилагаемом файле, среди которых нет идущих подряд символов P.

s = sub(r'PP', 'P P', s)
print(max(map(len, s.split())))
или
s = sub(r'P(?=P)', 'P ', s)
print(max(map(len, s.split())))

3. ЗАМЕНА ПАРНАЯ РАЗНЫХ БУКВ
Текстовый файл состоит не более, чем из  10**7  строчных букв английского алфавита. Найдите максимальную длину подстроки, в которой символы a и d не стоят рядом.

s = sub(r'a(?=d)|d(?=a)', '* ', s)

4. ЗАМЕНА ЛЮБЫХ ПАРНЫХ ОДИНАКОВЫХ БУКВ
Текстовый файл состоит не более чем из  106  символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны.

s = sub(r'(.)(?=\1)', r'\1 ', s)

5. ЗАМЕНА КОМБИНАЦИЙ ОПРЕДЕЛЕННЫХ БУКВ
Текстовый файл состоит не более, чем из 1 200 000 прописных символов латинского алфавита. Определите максимальное количество идущих подряд символов, среди которых любые два символа из набора Q, R, S в различных комбинациях (с учётом повторений) не стоят рядом.

s = sub(r'[QRS](?=[QRS])', r'\1 ', s)

6. ЗАМЕНА КОМБИНАЦИЙ БУКВ ЛИБО ЦИФР
Текстовый файл состоит из символов, обозначающих буквы латинского алфавита А, В и С и цифры 8 и 9.
Определите в прилагаемом файле максимальное количество идущих подряд символов, среди которых ни одна буква не стоит рядом с буквой, а цифра — с цифрой.

s = sub(r'([A-Z](?=[A-Z]))|([0-9](?=[0-9]))', r'\1 ', s)

1. ПАРЫ
Найдите максимальное количество подряд идущих пар символов АС или АВ. Искомая подстрока может включать только пары АВ, только пары АС или содержать одновременно как пары АС, так и пары АВ.

print(max(map(len, findall(r'(?:AB|AC)+', s))) // 2)

2. ГЛАСНЫЕ И СОГЛАСНЫЕ
Текстовый файл состоит из символов A, B, C, D и O. Определите максимальное количество идущих подряд пар символов вида
согласная + гласная

print(max(map(len, findall(r'(?:[BCD][AO])+', s)))//2)

3. ЧЕРЕДОВАНИЕ
Текстовый файл состоит из символов E, D и F. Определите максимальную длину непрерывной последовательности символов, состоящей из чередующихся символов E и F в прилагаемом файле. Искомая последовательность может начинаться как с символа E, так и с символа F.

print(max(map(len, findall(r'(?:EF)+E?|(?:FE)+F?', s))))

4. ЦИФРЫ
Текстовый файл состоит из символов, обозначающих заглавные буквы латинского алфавита и цифры от 1 до 9 включительно. Определите в прилагаемом файле максимальное количество идущих подряд символов, которые могут представлять запись числа в шестнадцатеричной системе счисления.

print(max(map(len, findall(r'[1-9A-F](?:0-9A-F)*', s))))

5. ГРОБ НА АРИФМЕТИКУ
Текстовый файл состоит из десятичных цифр, знаков «+» и «*» (сложения и умножения). Определите максимальное количество символов в непрерывной последовательности, являющейся корректным арифметическим выражением с целыми неотрицательными числами (без знака), значение которого равно нулю. В этом выражении никакие два знака арифметических операций не стоят рядом, порядок действий определяется по правилам математики. В записи чисел отсутствуют незначащие (ведущие) нули.

I способ:
from re import *

s = open('24_17685.txt').readline()
num = r'([1-9][0-9]*|0)'
proiz = rf'(({num}\*)*0(\*{num})*)'
reg = rf'{proiz}(\+{proiz})+'

print(len(max([x.group() for x in finditer(reg, s)], key=len)))
II способ:
from re import *

s = open('24_17685.txt').readline()
num = r'(?:[1-9][0-9]*|0)'
proiz = rf'(?:(?:{num}\*)*0(?:\*{num})*)'
reg = rf'{proiz}(?:\+{proiz})+'

print(max(map(len, findall(reg, s))))
 

Шаблон & Описание
1 ^ — соответствует началу строки.
2 $— соответствует концу строки.
3 . — соответствует любому символу, кроме новой строки. Использование флага re.M позволяет также соответствовать новой строке.
4 [4fw] — соответствует любому из символов в скобках.
5 [^4fw] — соответствует любому символу, кроме тех, что в квадратных скобках.
6 foo* — соответствует 0 или более вхождений “foo”.
7 bar+ —- соответствует 1 или более вхождениям “bar”.
8 foo? —- соответствует 0 или 1 вхождению “foo”.
9 bar{3} —- соответствует трем подряд вхождениям “bar”.
10 foo{3,} — соответствует 3 или более вхождениям “foo”.
11 bar{2,5} —- соответствует от 2 до 5 вхождениям “bar”.
12 a|b — соответствует либо a, либо b.
13 (foo) — группирует регулярные выражения.
14 (?imx) — временно включает параметры i, m или x в регулярное выражение. Если используются круглые скобки — затрагивается только эта область.
15 (?-imx) — временно отключает опции i, m или x в регулярном выражении. Если используются круглые скобки — затрагивается только эта область.
16 (?: foo) — Группирует регулярные выражения без сохранения совпадающего текста.
17 (?imx: re) — Временно включает параметры i, m или x в круглых скобках.
18 (?-imx: re) — временно отключает опции i, m или x в круглых скобках.
19 (?#…) — комментарий.
20 (?= foo) — совпадает со всеми словами после которых » foo».
21 (?! foo) — совпадает со всеми словами после которых нет » foo».
22 (?> foo) — совпадает со всеми словами перед которыми » foo».
23 \w — совпадает с буквенным символом.
24 \W — совпадает с не буквенным символом.
25 \s — совпадает с пробельными символами (\t, \n, \r, \f и пробелом).
26 \S — все кроме пробельных символов.
27 \d — соответствует цифрам (0-9).
28 \D — все кроме цифры.
29 \A — соответствует началу строки.
30 \Z – соответствует концу строки. Включая перевод на новую строку, если такая есть.
31 \z — соответствует концу строки.
32 \G — соответствует месту, где закончилось последнее соответствие.
33 \b — соответствует границам слов, когда поставлены внешние скобки.
34 \B — все кроме границы слова.
35 **\n,\t,\r,\f ** — соответствует новым строкам, подстрокам.
36 \1…\9 — соответствует подгруппе n-й группы.
37 \10 — соответсвуйет номеру группы. В противном случае относится к восьмеричному представлению символьного кода.
 
Пример & Описание
1 <.*> Жадное повторение: соответствует “perl>”
2 <.*?> Ленивый поиск: соответствует “” в “perl>”

гайдик по регуляркам
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать