def matchPrefix(text):
    """
    This is silver bullet, cornerstone and magic wand of speed of this algorithm
    it filters patterns using manually selected rules. Yes, yes, it's "dirty" code and it could be beautified in
    many ways but this library intended to be fast, not beautiful. Without matching is x1.3 slower so let it be.
    :param text: text with date to match
    :return: list of patterns to run against
    """
    basekeys = []
    if not text[0].isdigit():
        if ord(text[0].lower()) in range(ord('a'), ord('z') + 1):
            basekeys = ['dt:date:eng1', 'dt:date:date_eng1x',
                'dt:date:eng3', 'dt:date:date_eng2_lc', 'dt:date:date_eng2',
                'dt:date:date_eng2_short', 'dt:date:date_eng3',
                'dt:date:weekday_eng', 'dt:date:weekday_eng_lc',
                'dt:date:weekday_eng_wshort', 'dt:date:weekday_eng_iso',
                'dt:date:weekday_short_eng_iso', 'dt:date:fr_base_article',
                'dt:date:fr_base_lc_article',
                'dt:date:weekday_eng_mshort_wshort']
            basekeys += ['dt:date:pt_base', 'dt:date:pt_base_lc',
                'dt:date:pt_base_article', 'dt:date:pt_base_lc_article']
            basekeys += ['dt:date:es_base', 'dt:date:es_base_lc',
                'dt:date:es_base_article', 'dt:date:es_base_lc_article',
                'dt:date:es_rare_1', 'dt:date:es_rare_2']
            basekeys += ['dt:date:it_base', 'dt:date:it_base_lc',
                'dt:date:it_base_article', 'dt:date:it_base_lc_article',
                'dt:date:it_rare_1', 'dt:date:it_rare_2']
        else:
            basekeys = ['dt:date:weekday_rus', 'dt:date:weekday_rus_lc1',
                'dt:date:rare_5', 'dt:date:rare_6']
    elif text[1] == '.' or text[2] == '.':
        basekeys = ['dt:date:date_2', 'dt:date:date_4', 'dt:date:date_rus3',
            'dt:date:date_4_point', 'dt:date:date_eng1', 'dt:date:noyear_1',
            'dt:date:rare_2', 'dt:date:rare_3']
        basekeys += ['dt:date:de_base', 'dt:date:de_base_lc']
    elif text[1] == ',' or text[2] == ',':
        basekeys = ['dt:date:date_rus']
    elif text[1] == '/' or text[2] == '/':
        basekeys = ['dt:date:date_1', 'dt:date:date_9', 'dt:date:date_8',
            'dt:date:date_usa', 'dt:date:date_usa_1', 'dt:date:rare_1']
    elif text[1] == '-' or text[2] == '-':
        basekeys = ['dt:date:date_iso8601', 'dt:date:date_iso8601_short']
    elif text[4] == '-':
        basekeys = ['dt:date:date_iso8601', 'dt:date:date_9']
    elif text[4] == '.':
        basekeys = ['dt:date:date_10']
    else:
        basekeys = ['dt:date:date_3', 'dt:date:date_5', 'dt:date:date_6',
            'dt:date:date_7', 'dt:date:date_rus', 'dt:date:date_rus2',
            'dt:date:date_rus_lc1', 'dt:date:date_rus_lc2',
            'dt:date:date_eng1', 'dt:date:date_eng1_short',
            'dt:date:date_eng1_lc', 'dt:date:date_eng1xx']
        basekeys += ['dt:date:date_1', 'dt:date:date_9', 'dt:date:date_8',
            'dt:date:date_usa', 'dt:date:date_usa_1', 'dt:date:rare_1',
            'dt:date:rare_2', 'dt:date:rare_3', 'dt:date:rare_4',
            'dt:date:date_5', 'dt:date:fr_base', 'dt:date:fr_base_lc']
        basekeys += ['dt:date:pt_base_article',
            'dt:date:pt_base_lc_article', 'dt:date:pt_base',
            'dt:date:pt_base_lc']
        basekeys += ['dt:date:de_base', 'dt:date:de_base_lc']
        basekeys += ['dt:date:bg_base', 'dt:date:bg_base_lc']
        basekeys += ['dt:date:es_base', 'dt:date:es_base_lc',
            'dt:date:es_base_article', 'dt:date:es_base_lc_article']
        basekeys += ['dt:date:it_base', 'dt:date:it_base_lc',
            'dt:date:it_base_article', 'dt:date:it_base_lc_article']
    return basekeys
