<jupyter_start><jupyter_text>Домашнее задание к лекции "Регулярные выражения"Внимание! При реализации всех заданий необходимо использовать именно функционал регулярных выражений для обработки текста.  Задание 1Напишите функцию, которая принимает на вход строку и проверяет является ли она валидным транспортным номером (1 буква, 3 цифры, 2 буквы, 2-3 цифры). Обратите внимание, что не все буквы кириллического алфавита используются в транспортных номерах.Если номер валиден, то функция должна возвращать отдельно номер и регион.Примеры работы программы:  1. `car_id = 'АВ222С96'`  Вниманию преподавателя, тут указан неверный формат гос номера, номер не может начинаться с двух букв Результат: `Номер АВ222С валиден. Регион: 96`2. `car_id = 'АБ22ВВ193'`Результат: `Номер не валиден`<jupyter_code>import re

def is_valid_transport_number(car_id):
    """
    Валидация русского автомобильного номера формата  аХХХааХХ или аХХХааХХХ
    """
    regex = r'(^[АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{2})(\d{2,3}$)'
    match = re.match(regex, car_id)

    if match:
        return f'Номер {match.group(1)} валиден. Регион: {match.group(2)}'
    else:
        return 'Номер не валиден'
assert is_valid_transport_number('А222ВС96') == 'Номер А222ВС валиден. Регион: 96'
assert is_valid_transport_number('АБ22ВВ193') == 'Номер не валиден'<jupyter_output><empty_output><jupyter_text>Задание 2Напишите функцию, которая будет удалять все последовательные повторы слов из заданной строки при помощи регулярных выражений.Пример работы программы:  `some_string = 'Напишите функцию функцию, которая будет будет будет будет удалять все все все все последовательные повторы слов из из из из заданной строки строки при помощи регулярных выражений'`Результат: `Напишите функцию, которая будет удалять все последовательные повторы слов из заданной строки при помощи регулярных выражений.`<jupyter_code>import re

some_string = 'Напишите функцию функцию, которая будет будет будет будет удалять все все все все последовательные повторы слов из из из из заданной строки строки при помощи регулярных выражений'

result = 'Напишите функцию, которая будет удалять все последовательные повторы слов из заданной строки при помощи регулярных выражений'

def remove_duplicates(text):
    return re.sub(r'(\w+)(\s+\1)+', r'\1', text)
remove_duplicates(some_string)
assert remove_duplicates(some_string) == result<jupyter_output><empty_output><jupyter_text>Задание 3Напишите функцию, которая будет возвращать акроним по переданной в нее строке со словами.Примеры работы программы:  1. `some_words = 'Информационные технологии'`Результат: `ИТ`2. `some_words = 'Near Field Communication'`Результат: `NFC`<jupyter_code>import re

def make_acronym(s):
    # (?:(?<=\s)|^) - проверка на начало строки либо пробел
    # далее (?:\w) берёт одну букву
    regex = r'(?:(?<=\s)|^)(?:\w)'

    return ''.join(re.findall(regex,s)).upper()
assert make_acronym('Информационные технологии') == 'ИТ'
assert make_acronym('Near Field Communication') == 'NFC'<jupyter_output><empty_output><jupyter_text>Задание 4Напишите функцию, которая будет принимать на вход список email-адресов и выводить их распределение по доменным зонам.Пример работы программы:  `emails = ['<EMAIL>, <EMAIL>, <EMAIL>, <EMAIL>, <EMAIL>', <EMAIL>]`Результат: ```gmail.com: 2test.in: 1 ya.ru: 2 mail.ru: 1```<jupyter_code>import re

def group_emails(emails):
    domain_regex = r'(?<=@)(\w.+)'    
    res = {}

    for email in emails:
        domain = re.findall(domain_regex,email)[0]
        res.setdefault(domain, 0)
        res[domain] += 1 
    
    for key, value in res.items():
      print(f'{key}: {value}')
       
emails = ['<EMAIL>', '<EMAIL>', '<EMAIL>', '<EMAIL>', '<EMAIL>', '<EMAIL>']
group_emails(emails)<jupyter_output>gmail.com: 2
test.in: 1
ya.ru: 2
mail.ru: 1<jupyter_text>Задание 5 (необязательное)Напишите функцию, которая будет подсчитывать сколько слов начинается на гласные, а сколько на согласные буквы в тексте (текст может быть написан как с использованием букв кириллицы, так и латиницы).Пример работы программы:  `some_text = 'Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ. Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные.'`Результат: ```Слов на гласные буквы: 9Слов на согласные буквы: 21 ```<jupyter_code>import re

def vowel_consonant_letters_counter(text):
    vowel_regex = r'(?:(?<=\s)|^)(?:[аеёиоуыэюяАЕЁИОУЫЭЮЯaeiouAEIOU][а-яёА-ЯЁa-zA-Z\-]+)'    
    consonant_regex = r'(?:(?<=\s)|^)(?:[^аеёиоуыэюяАЕЁИОУЫЭЮЯaeiouAEIOU][а-яёА-ЯЁa-zA-Z\-]*)'    

    vowels = re.findall(vowel_regex,text)   
    consonants = re.findall(consonant_regex,text)

    print(f'Слов на гласные буквы: {len(vowels)}')   
    print(f'Слов на согласные буквы: {len(consonants)}')   
    
       
some_text = 'Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ. Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные.'

vowel_consonant_letters_counter(some_text)<jupyter_output>Слов на гласные буквы: 9
Слов на согласные буквы: 21<jupyter_text>Задание 6 (необязательное)Напишите функцию, которая будет проверять номер сотового телефона на валидность, если он валиден, то переводить его в формат:   +7-xxx-xxx-xx-xx  Постарайтесь предусмотреть как можно больше адекватных форматов изначального ввода номера.Примеры работы программы:  1. `phone = '+7 955 555-55-55'`Результат: `+7-950-555-55-55`2. `phone = '8(955)555-55-55'`Результат: `+7-950-555-55-55`3. `phone = '+7 955 555 55 55'`Результат: `+7-950-555-55-55`4. `phone = '7(955) 555-55-55'`Результат: `+7-950-555-55-55`5. `phone = '423-555-55-5555'`Результат: `Номер не валиден`6. `phone = '123-456-789'`Результат: `Номер не валиден`<jupyter_code>import re

def format_phone(input):
    regex = r'[+78]{1,2}[\s(]?(\d{3})[\s)]{0,2}(\d{3})[\s-](\d{2})[\s-](\d{2})'
    match = re.match(regex, input)

    if match:
        return f'+7-{match.group(1)}-{match.group(2)}-{match.group(3)}-{match.group(4)}'
    else:
        return 'Номер не валиден'    
    
expected = '+7-955-555-55-55'
assert format_phone('+7 955 555-55-55') == expected
assert format_phone('8(955)555-55-55') == expected
assert format_phone('+7 955 555 55 55') == expected
assert format_phone('7(955) 555-55-55') == expected
assert format_phone('423-555-55-5555') == 'Номер не валиден'
assert format_phone('123-456-789') == 'Номер не валиден'<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12307692307692308, 'fraction_numerical': 0.041374159820761765, 'mean_word_length': 5.305084745762712, 'pattern_counts': {'":': 0, '<': 40, '<?xml version=': 0, '>': 35, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '34135', 'license': 'MIT', 'n_tokens_mistral': 2959, 'n_tokens_neox': 3208, 'n_words': 623, 'path': 'regex/regex.ipynb', 'repo_name': 'aleksander-ivanov/pyda_homeworks', 'size': '6747'}