from typing import Iterator
from typing import List
import unicodedata
import re


def preprocess(strings: Iterator[str]) -> List[str]:
    """Preprocess a collection of strings.

    The following preprocessing steps are taken: Convert to lowercase, normalize unicode, and remove special
    characters (non-alphanumeric characters, except for '.', '!', and '?').

    :param strings: Iterator[str]
        A sequence of un-processed strings.
    :return: List[str]
        A list of preprocessed strings.
    """
    def preprocess_string(s: str) -> str:
        s = s.lower().strip()
        s = ''.join(c for c in unicodedata.normalize('NFD', s)
                    if unicodedata.category(c) != 'Mn')
        s = re.sub(r'[^a-zA-Z.!?]+', r' ', s)
        return s
    return [preprocess_string(s) for s in strings]