Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from typing import Container, Iterable
- import string
- import re
- def normalize_word(word: str) -> str:
- """
- Нормализует строку к единому формату.
- note: использую next(..., ''), чтобы функция не райзила IndexError
- """
- return next(re.findall('[a-zA-Z]+', word.lower()), '')
- def check_word(word: str, dictionary: Container[str]) -> bool:
- """Проверка, что слово принадлежит словарю"""
- normalized_word = normalize_word(word)
- return normalized_word in dictionary
- def create_dictionary(words: Iterable[str]) -> Container[str]:
- """Создает словарь на основе слов, пришедших на вход"""
- return set(map(normalize_word, words))
- def tokenize_text(text: str):
- """
- Токенизирует текст. Нужно было с той целью, чтобы избавиться от лишних
- деталей в тексте: к примеру, излишняя вариация "ненужных" символов ',', '.' и т.д.
- Токен может быть двух типов:
- 1. word - описывает некоторое слово в тексте. Представлен как ['word', <word-value>]
- 2. separator - описывает подстроку, которая является разделителем между словами.
- Представлен как ['separator', <separator-chars-amount>]
- """
- tokens = [['separator', 0]]
- for char in text:
- if char in string.ascii_letters:
- if tokens[-1][0] == 'word':
- tokens[-1][1] += char
- else:
- tokens.append(['word', char])
- else:
- if tokens[-1][0] == 'separator':
- tokens[-1][1] += 1
- else:
- tokens.append(['separator', 1])
- return tokens
- def check_text(tokens, dictionary):
- """
- Проверка всего текста на орфографию. На вход приходят токены, на которые был
- разбит текст, и словарь.
- Возвращаемое значение - список, состоящий из блоков с результатами проверки.
- Каждый блок состоит из двух элементов:
- 1. Результат проверки
- 2. Количество символов, которые были проверены
- """
- checked = []
- for token_type, token_value in tokens:
- if token_type == 'word':
- check_result = check_word(token_value, dictionary)
- checked.append((check_result, len(token_value)))
- else:
- checked.append((True, token_value))
- return checked
- def render_check_result(result):
- """Репрезентация результатов проверки в формат, требующийся в задании"""
- repr_symbols = ['~', '.']
- return ''.join(repr_symbols[is_correct] * length for is_correct, length in result)
- def main():
- text = input()
- words = (input() for _ in range(int(input())))
- dictionary = create_dictionary(words)
- tokens = tokenize_text(text)
- check_result = check_text(tokens, dictionary)
- print(text)
- print(render_check_result(check_result))
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement