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

Упражнения

Ввод-вывод разрешается как стандартный, так и файловый (input.txt/output.txt).

A: Вещественное число с фиксированной точкой

Составьте регулярное выражение, соответствующее только вещественному числу с фиксированной точкой.

Вещественное число содержит, быть может, знак - (минус), а затем целую и, возможно, дробную части, которые, при наличии дробной части, разделяются точкой. Дробная часть не должна заканчиваться нулём, а целая не должна содержать ведущих нулей.

Для каждой строки входных данных выведите одно слово YES или NO, в зависимости от того, является ли эта запись вещественным числом в смысле данного определения.

Вся строка целиком должна быть вещественным числом, так что не забудьте про якоря ^ и $.

Ввод Вывод
-123
102.409
.78
167.0
YES
YES
NO
NO

B: С-строка

Строки в языке C (в Питоне действуют аналогичные правила) заключаются в двойные кавычки, при этом сам символ кавычек в строке должен быть экранирован символом обратного слэша “\”.

Определите по данной строке, является ли она корректной С-строкой.

Ввод Вывод
"test test"
"test \" test"
"test""test"
YES
YES
NO

C: Смайлик

Составьте регулярное выражение, соответствующее смайлику.

Смайлик состоит из трёх частей: глаз, носа (который может отсутствовать) и рта. Глаза это один символ “:” или “;”. Нос это один символ “-”. Рот состоит из одного или более одинаковых символов рта: “)”, “(”, “/”, “\”, “|”, “D”.

Ввод Вывод
:)
;-///
)))
:-()
YES
YES
NO
NO

D: Время

Составьте регулярное выражение, соответствующее времени, записанному в формате HH:MM:SS **, где ** — AM или PM,, а между HH:MM:SS и ** находится ровно один пробел.

MM и SS — это двузначные числа от 00 до 59, а HH — двузначное число от 00 до 11.

Ввод Вывод
10:30:29 PM
YES

E: Проверка на простоту

Натуральное число N будем записывать при помощи N единиц подряд.

Составьте регулярное выражение проверяющее, что данное число является составным. Выражение должно работать для всех натуральных чисел, больших 1.

Например, регулярное выражение ^(11){2,}$ правильно работает для всех чисел от 2 до 8, но дает неверный ответ для числа 9.

Ввод Вывод
11
1111
NO
YES

X: Текст

Составьте регулярное выражение, соответствующее красивому тексту.

Текст называется красивым, если он состоит из ненулевого числа красивых предложений, разделённых одним пробелом. Предложение называется красивым, если оно представляет собой непустую последовательность слов, разделённых одним пробелом, заканчивается точкой, многоточием (из ровно трёх точек), знаком вопроса или восклицательным знаком. Вместо пробела между словами может находиться знак препинания, а именно строка “”, “”, “ - ” или “, - ”. Первое слово в предложении должно начинаться с заглавной буквы. Слово называется красивым, если оно состоит из одной или двух частей, разделённых одним дефисом. В каждой части все буквы должны быть строчными латинскими, а первая буква также может быть и заглавной латинской. Длина части должна быть не меньше 1. Кроме того, слово, состоящее из одной части, может быть аббревиатурой, то есть состоять исключительно из заглавных латинских букв.

Ввод Вывод
This program is free-software; you can copy it.
i cannot write bEaUtIfUl sentences :(((
YES
NO

Y: EuroEnglish

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

Первоочередной задачей будет избавление от буквы c, которая в сочетаниях сi и сe будет изменяться на s, в сочетании ck — опускаться, а в остальных случаях заменяться на k. При этом все замены будут производиться в строгом порядке слева направо. То есть, например, в слове success сначала первая из двух букв c заменится на k, а затем вторая — 0на s, то есть получится suksess. А слово cck превратится в kk.

На второй год из английских слов изымут все удвоенные буквы: ee изменят на i, oo — на u, a в остальных комбинациях будут просто писать одну букву вместо двух одинаковых. Такие замены также будут делать строго в порядке слева направо. Так, слово ooo превратится в uo, а oou — просто в u (в нем сначала oo заменится на u, а затем uu — на u), слово iee превратится в i (в нем сначала ee заменится на i, а затем ii — на i).

На третий год на конце слова станут опускать букву е, если эта буква не является единственной буквой в слове.

Наконец, завершением реформы станет отмена артиклей (в английском языке три артикля: а, an и the). При этом удаляться эти артикли будут только тогда, когда они в исходном тексте были словами a, an, the. То есть, например, текст the table после реформ первых трех лет превратиться в th tabl, а после реформы четвертого года — просто в tabl. А слово aaaaa после реформы первых лет станет словом a, но поскольку изначально оно не было словом a (артиклем), то оно в итоге так и останется словом a.

Напишите программу, которая будет переводить классический английский текст на Eвроинглиш.

Дана одна строка текста, состоящая не более чем из 200 символов: латинских строчных и заглавных букв, пробелов и знаков препинания (в тексте могут встречаться: точка, запятая, вопросительный и восклицательный знаки, двоеточие, тире, точка с запятой, открывающаяся и закрывающаяся скобки, апострофы, кавычки). Заглавные буквы могут встречаться только в начале слова. Нигде подряд не могут стоять два пробела. В начале и в конце строки не может стоять пробел. Слова отделяются друг от друга пробелами и/или знаками препинания.

Выведите преобразованную строку с учетом следующих требований:

Ввод Вывод
cacao and coffee
kakao and kofi
Cinderella! Where Is The Dress???
Sinderela! Wher Is Dres???
'A' is a letter
'' is leter
!!!Hello!!!A-the-"word"
!!!Helo!!!--"word"
Aaaa then the ckckck
A then k
"A"-the an
""-
A the an
 
success
sukses

Z: Сравнение URL

Для идентификации ресурсов в сети Internet используются URL (Uniform Resource Locator). URL состоит из нескольких элементов: протокол, хост, порт, путь, файл и секция. Некоторые элементы URL могут быть опущены. Рассмотрим упрощенный формат URL:

[протокол://]хост[:порт][путь/[файл[#секция]]]

Заключенные в квадратные скобки элементы могут быть опущены, т.е. например, можно не указать протокол или секцию. Но, например, если указан файл, то обязательно должен быть указан путь. Регистр букв в элементах URL не важен.

Рассмотрим кратко все элементы URL:

Различные символы в URL могут быть заменены своими шестнадцатеричными ASCII кодами с помощью символа "%", например a = %41, Z = %5A. В коде всегда используется ровно две шестнадцатеричные цифры.

Некоторые символы могут встречаться в элементах URL только как шестнадцатеричные коды — все символы, кроме букв латинского алфавита, цифр и символов "." и "-", а некоторые не могут встречаться вообще: "\", "#","*", "@", "%", "?", ":", ",", а также символы с ASCII-кодом меньше %20. Символ "/" может встречаться в элементах URL только в пути для разделения входящих в него каталогов. Имя файла не может состоять только из точек.

Рассмотрим примеры URL:

http://neerc.ifmo.ru/school

ftp://somewhere.net:1234/pub/files/coolgame.zip

nobody.nowhere.net/some%20dir/some%20file#some%20info

Ваша цель в этой задаче — помочь разработчикам web-сервера. Для web-сервера отсутствующие части URL имеют следующие значения по умолчанию:
Протокол: http
Порт: 80
Путь: пустая строка
Файл: index.html
Секция: пустая строка

Различные как строки URL могут указывать на один и тот же ресурс, например следующие три URL:
neerc.ifmo.ru
http://neerc.ifmo.ru:80/index.html#
Http://NEERC.IFMO.Ru/Dir/../././

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

Входные данные состоят из двух строк, каждая из них содержит URL. Оба URL удовлетворяют формату, приведенному в условии этой задачи. Длина каждого URL не превосходит 200 символов. Гарантируется, что ни один из промежуточных каталогов на пути к ресурсу не лежит выше корневого каталога (т.е. не может встретиться, например, URL http://somewhere.com/../dir/index.html) а также, что имена всех каталогов состоят по крайней мере из одного символа (два символа "/" не могут идти подряд в любом месте, кроме как непосредственно после двоеточия после имени протокола).

Выведите YES, если оба URL, приведенные во входных данных, указывают на один и тот же ресурс, и NO в противном случае.

Ввод Вывод
http://neerc.ifmo.ru:80/index.html#
neerc.ifmo.ru
YES
neerc.ifmo.ru/dir/../school
NEERC.IFMO.RU/./SCHOOL
YES
neerc.ifmo.ru
%6E%65%65%72%63%2E%69%66%6D%6F%2E%72%75
YES
nowhere.com
somewhere.com
NO
http://neerc.ifmo.ru
ftp://neerc.ifmo.ru
NO
neerc.ifmo.ru/index.htm
neerc.ifmo.ru/index.html
NO
neerc.ifmo.ru:80
neerc.ifmo.ru:8080/index.html
NO
http://somewhere.com
somewhere.com/index.html#a
NO