#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Шаблоны и прочие константы.

# Количественные числительные
# (до 30 разрядов включительно)

# Родительный падеж
r_ca = (
  (
    (
      (
        'ноля',
        ('тысячи', 'тысяч'),
        ('миллиона', 'миллионов'),
        ('миллиарда', 'миллиардов'),
        ('триллиона', 'триллионов'),
        ('квадриллиона', 'квадриллионов'),
        ('квинтиллиона', 'квинтиллионов'),
        ('секстиллиона', 'секстиллионов'),
        ('септиллиона', 'септиллионов'),
        ('октиллиона', 'октиллионов')
      ),
      'ста',
      'двухсот',
      'трёхсот',
      'четырехсот',
      'пятисот',
      'шестисот',
      'семисот',
      'восьмисот',
      'девятисот'
    ),
    'десяти',
    'двадцати',
    'тридцати',
    'сорока',
    'пятидесяти',
    'шестидесяти',
    'семидесяти',
    'восьмидесяти',
    'девяноста'
  ),
  ('одного', 'одиннадцати'),
  ('двух', 'двенадцати'),
  ('трёх', 'тринадцати'),
  ('четырёх', 'четырнадцати'),
  ('пяти', 'пятнадцати'),
  ('шести', 'шестнадцати'),
  ('семи', 'семнадцати'),
  ('восьми', 'восемнадцати'),
  ('девяти', 'девятнадцати')
)
# Дательный падеж
d_ca = (
  (
    (
      (
        'нолю',
        ('тысяче', 'тысячам'),
        ('миллиону', 'миллионам'),
        ('миллиарду', 'миллиардам'),
        ('триллиону', 'триллионам'),
        ('квадриллиону', 'квадриллионам'),
        ('квинтиллиону', 'квинтиллионам'),
        ('секстиллиону', 'секстиллионам'),
        ('септиллиону', 'септиллионам'),
        ('октиллиону', 'октиллионам')
      ),
      'ста',
      'двумстам',
      'тремстам',
      'четыремстам',
      'пятистам',
      'шестистам',
      'семистам',
      'восьмистам',
      'девятистам'
    ),
    'десяти',
    'двадцати',
    'тридцати',
    'сорока',
    'пятидесяти',
    'шестидесяти',
    'семидесяти',
    'восьмидесяти',
    'девяноста'
  ),
  ('одному', 'одиннадцати'),
  ('двум', 'двенадцати'),
  ('трём', 'тринадцати'),
  ('четырём', 'четырнадцати'),
  ('пяти', 'пятнадцати'),
  ('шести', 'шестнадцати'),
  ('семи', 'семнадцати'),
  ('восьми', 'восемнадцати'),
  ('девяти', 'девятнадцати')
)
# Творительный падеж
t_ca = (
  (
    (
      (
        'нолём',
        ('тысячей', 'тысячами'),
        ('миллионом', 'миллионами'),
        ('миллиардом', 'миллиардами'),
        ('триллионом', 'триллионами'),
        ('квадриллионом', 'квадриллионами'),
        ('квинтиллионом', 'квинтиллионами'),
        ('секстиллионом', 'секстиллионами'),
        ('септиллионом', 'септиллионами'),
        ('октиллионом', 'октиллионами')
      ),
      'ста',
      'двумя стами',
      'тремя стами',
      'четырьмя стами',
      'пятьюстами',
      'шестьюстами',
      'семьюстами',
      'восемьюстами',
      'девятьюстами'
    ),
    'десятью',
    'двадцатью',
    'тридцатью',
    'сорока',
    'пятьюдесятью',
    'шестьюдесятью',
    'семьюдесятью',
    'восемьюдесятью',
    'девяноста'
  ),
  ('одним', 'одиннадцатью'),
  ('двумя', 'двенадцатью'),
  ('тремя', 'тринадцатью'),
  ('четырьмя', 'четырнадцатью'),
  ('пятью', 'пятнадцатью'),
  ('шестью', 'шестнадцатью'),
  ('семью', 'семнадцатью'),
  ('восемью', 'восемнадцатью'),
  ('девятью', 'девятнадцатью')
)
# Винительный падеж
v_ca = (
  (
    (
      (
        'ноль',
        ('тысячу', 'тысяч'),
        ('миллион', 'миллионов'),
        ('миллиард', 'миллиардов'),
        ('триллион', 'триллионов'),
        ('квадриллион', 'квадриллионов'),
        ('квинтиллион', 'квинтиллионов'),
        ('секстиллион', 'секстиллионов'),
        ('септиллион', 'септиллионов'),
        ('октиллион', 'октиллионов')
      ),
      'сто',
      'двести',
      'триста',
      'четыреста',
      'пятьсот',
      'шестьсот',
      'семьсот',
      'восемьсот',
      'девятьсот'
    ),
    'десять',
    'двадцать',
    'тридцать',
    'сорок',
    'пятьдесят',
    'шестьдесят',
    'семьдесят',
    'восемьдесят',
    'девяносто'
  ),
  ('один', 'одиннадцать'),
  ('два', 'двенадцать'),
  ('три', 'тринадцать'),
  ('четыре', 'четырнадцать'),
  ('пять', 'пятнадцать'),
  ('шесть', 'шестнадцать'),
  ('семь', 'семнадцать'),
  ('восемь', 'восемнадцать'),
  ('девять', 'девятнадцать')
)
# Предложный падеж
p_ca = (
  (
    (
      (
        'ноле',
        ('тысяче', 'тысячах'),
        ('миллионе', 'миллионах'),
        ('миллиарде', 'миллиардах'),
        ('триллионе', 'триллионах'),
        ('квадриллионе', 'квадриллионах'),
        ('квинтиллионе', 'квинтиллионах'),
        ('секстиллионе', 'секстиллионах'),
        ('септиллионе', 'септиллионах'),
        ('октиллионе', 'октиллионах')
      ),
      'ста',
      'двухстах',
      'трехстах',
      'четырёхстах',
      'пятистах',
      'шестистах',
      'семистах',
      'восьмистах',
      'девятистах'
    ),
    'десяти',
    'двадцати',
    'тридцати',
    'сорока',
    'пятидесяти',
    'шестидесяти',
    'семидесяти',
    'восьмидесяти',
    'девяноста'
  ),
  ('одном', 'одиннадцати'),
  ('двух', 'двенадцати'),
  ('трёх', 'тринадцати'),
  ('четырёх', 'четырнадцати'),
  ('пяти', 'пятнадцати'),
  ('шести', 'шестнадцати'),
  ('семи', 'семнадцати'),
  ('восьми', 'восемнадцати'),
  ('девяти', 'девятнадцати')
)

# Порядковые числительные
ordinal_d = {
  '0':'нулевой',
  '1':'первый',
  '2':'второй',
  '3':'третий',
  '4':'четвёртый',
  '5':'пятый',
  '6':'шестой',
  '7':'седьмой',
  '8':'восьмой',
  '9':'девятый',
  '11':'одиннадцатый',
  '12':'двенадцатый',
  '13':'тринадцатый',
  '14':'четырнадцатый',
  '15':'пятнадцатый',
  '16':'шестнадцатый',
  '17':'семнадцатый',
  '18':'восемнадцатый',
  '19':'девятнадцатый',
  '10':'десятый',
  '20':'двадцатый',
  '30':'тридцатый',
  '40':'сороковой',
  '50':'пятидесятый',
  '60':'шестидесятый',
  '70':'семидесятый',
  '80':'восьмидесятый',
  '90':'девяностый',
  'i_sr':('ье', 'ое'),
  'i_zh':('ья', 'ая'),
  'i_mn':('ьи', 'ые'),
  'r_mu':('ьего', 'ого'),
  'r_sr':('ьего', 'ого'),
  'r_zh':('ьей', 'ой'),
  'r_mn':('ьих', 'ых'),
  'd_mu':('ьему', 'ому'),
  'd_sr':('ьему', 'ому'),
  'd_zh':('ьей', 'ой'),
  'd_mn':('ьим', 'ым'),
  'v_zh':('ью', 'ую'),
  't_mu':('ьим', 'ым'),
  't_sr':('ьим', 'ым'),
  't_zh':('ьей', 'ой'),
  't_mn':('ьими', 'ыми'),
  'p_mu':('ьем', 'ом'),
  'p_sr':('ьем', 'ом'),
  'p_zh':('ьей', 'ой'),
  'p_mn':('ьих', 'ых')
}

# Определение падежа по окончанию
mn_pad = {'е':'i_mn', 'м':'d_mn', 'х':'r_mn', 'ми':'t_mn'}
mu_pad = {'':'i_mu', 'а':'r_mu', 'у':'d_mu', 'ом':'t_mu', 'е':'p_mu',
          'й':'i_mu', 'я':'r_mu', 'ю':'d_mu', 'ем':'t_mu', 'и':'p_mu'}
sr_pad = {'е':'i_sr', 'у':'d_sr', 'ю':'d_sr', 'я':'r_sr', 'ем':'t_sr', 'и':'p_sr'}
zh_pad = {'а':'i_zh', 'ы':'r_zh', 'е':'d_zh', 'ой':'t_zh', 'у':'v_zh',
          'я':'i_zh', 'и':'r_zh', 'ей':'t_zh', 'ю':'v_zh'}
adj_pad = {'ий':'i_mu', 'его':'r_mu', 'ему':'d_mu', 'им':'t_mu', 'ем':'p_mu',
           'ый':'i_mu', 'ого':'r_mu', 'ому':'d_mu', 'ым':'t_mu', 'ом':'p_mu',
           'ее':'i_sr', 'ое':'i_sr', 'ая':'i_zh', 'яя':'i_zh', 'ей':'r_zh',
           'ой':'r_zh', 'ую':'v_zh', 'юю':'v_zh', 'ие':'i_mn', 'им':'d_mn',
           'их':'r_mn', 'ими':'t_mn', 'ые':'i_mn', 'ым':'d_mn',
           'ых':'r_mn', 'ыми':'t_mn'}

months = (r' (января|февраля|марта|апреля|мая|июня|'
          r'июля|августа|сентября|октября|ноября|декабря)')

# Обозначения единиц измерения и числительных
units = (r"(%|°|'|℃|В\b|К\b|М\b|£|₽|\$|га\b|[кМГ]?(Гц|пк|Дж\b|Вт\b)|[км_]г\b|"
         r"(мк|[кмнс]?)м\b|[кмс]?м[²³]|[кМ]?т\b|га\b|уз\b|дБ\b|сек\b|"
         r"л\.с\.|л\b|а\.е\.|шт\.|ед\.|тыс\.|млн|млрд|трлн|атм\b)")
pre_units = ('м', 'км', 'мм', 'см', 'пк', 'кпк', 'Мпк', 'Гпк', 'а.е.', '%')
zh_units = ('т', 'кт', 'Мт', 'а.е.', 'л.с.', 'сек', "'", 'ед.', 'тыс.', 'шт.', 'атм')

# Падежные формы единиц измерения и числительных
# в единственном/множественном числе:
# именительный, родительный, дательный, творительный, предложный
# и форма именительного падежа для числительных 2, 3, 4
forms = {
  '%':     ('процент', 'процентов', 'процента', 'процентов',
            'проценту', 'процентам', 'процентом', 'процентами',
            'проценте', 'процентах', 'процента'),
  '°':     ('градус', 'градусов', 'градуса', 'градусов', 'градусу', 'градусам',
            'градусом', 'градусами', 'градусе', 'градусах', 'градуса'),
  '℃':    ('градус Цельсия', 'градусов Цельсия', 'градуса Цельсия',
            'градусов Цельсия', 'градусу Цельсия', 'градусам Цельсия',
            'градусом Цельсия', 'градусами Цельсия', 'градусе Цельсия',
            'градусах Цельсия', 'градуса Цельсия'),
  'В':     ('вольт', 'вольт', 'вольта', 'вольт', 'вольту', 'вольтам',
            'вольтом', 'вольтами', 'вольте', 'вольтах', 'вольта'),
  'К':     ('кельвин', 'кельвинов', 'кельвина', 'кельвинов',
            'кельвину', 'кельвинам', 'кельвином', 'кельвинами',
            'кельвине', 'кельвинах', 'кельвина'),
  '$':     ('доллар', 'долларов', 'доллара', 'долларов', 'доллару', 'долларам',
            'долларом', 'долларами', 'долларе', 'долларах', 'доллара'),
  'га':    ('гектар', 'гектаров', 'гектара', 'гектаров', 'гектару', 'гектарам',
            'гектаром', 'гектарами', 'гектаре', 'гектарах', 'гектара'),
  '_г':    ('грамм', 'граммов', 'грамма', 'граммов', 'грамму', 'граммам',
            'граммом', 'граммами', 'грамме', 'граммах', 'грамма'),
  'кг':    ('килограмм', 'килограммов', 'килограмма', 'килограммов',
            'килограмму', 'килограммам', 'килограммом', 'килограммами',
            'килограмме', 'килограммах', 'килограмма'),
  'км':    ('километр', 'километров', 'километра', 'километров', 'километру',
            'километрам', 'километром', 'километрами', 'километре',
            'километрах', 'километра'),
  'нм':    ('нанометр', 'нанометров', 'нанометра', 'нанометров', 'нанометру',
            'нанометрам', 'нанометром', 'нанометрами', 'нанометре',
            'нанометрах', 'нанометра'),
  'мг':    ('миллиграмм', 'миллиграммов', 'миллиграмма', 'миллиграммов',
            'миллиграмму', 'миллиграммам', 'миллиграммом', 'миллиграммами',
            'миллиграмме', 'миллиграммах', 'миллиграмма'),
  'мм':    ('миллиметр', 'миллиметров', 'миллиметра', 'миллиметров',
            'миллиметру', 'миллиметрам', 'миллиметром', 'миллиметрами',
            'миллиметре', 'миллиметрах', 'миллиметра'),
  'см':    ('сантиметр', 'сантиметров', 'сантиметра', 'сантиметров',
            'сантиметру', 'сантиметрам', 'сантиметром', 'сантиметрами',
            'сантиметре', 'сантиметрах', 'сантиметра'),
  'тыс.':  ('тысяча', 'тысяч', 'тысячи', 'тысяч', 'тысяче',  'тысячам',
            'тысячей', 'тысячами', 'тысяче', 'тысячах', 'тысячи'),
  'млн':   ('миллион', 'миллионов', 'миллиона', 'миллионов', 'миллиону',
            'миллионам', 'миллионом', 'миллионами', 'миллионе', 'миллионах',
            'миллиона'),
  'млрд':  ('миллиард', 'миллиардов', 'миллиарда', 'миллиардов', 'миллиарду',
            'миллиардам', 'миллиардом', 'миллиардами', 'миллиарде',
            'миллиардах', 'миллиарда'),
  'трлн':  ('триллион', 'триллионов', 'триллиона', 'триллионов', 'триллиону',
            'триллионам', 'триллионом', 'триллионами', 'триллионе',
            'триллионах', 'триллиона'),
  'м':     ('метр', 'метров', 'метра', 'метров', 'метру', 'метрам',
            'метром', 'метрами', 'метре', 'метрах', 'метра'),
  'мкм':   ('микрометр', 'микрометров', 'микрометра', 'микрометров',
            'микрометру', 'микрометрам', 'микрометром', 'микрометрами',
            'микрометре', 'микрометрах', 'микрометра'),
  'кт':    ('килотонна', 'килотонн', 'килотонны', 'килотонн', 'килотонне',
            'килотоннам', 'килотонной', 'килотоннами', 'килотонне',
            'килотоннах', 'килотонны'),
  'Мт':    ('мегатонна', 'мегатонн', 'мегатонны', 'мегатонн', 'мегатонне',
            'мегатоннам', 'мегатонной', 'мегатоннами', 'мегатонне',
            'мегатоннах', 'мегатонны'),
  'т':     ('тонна', 'тонн', 'тонны', 'тонн', 'тонне', 'тоннам', 'тонной',
            'тоннами', 'тонне', 'тоннах', 'тонны'),
  'кВт':   ('киловатт', 'киловатт', 'киловатта', 'киловатт', 'киловатту',
            'киловаттам', 'киловаттом', 'киловаттами', 'киловатте',
            'киловаттах', 'киловатта'),
  'МВт':   ('мегаватт', 'мегаватт', 'мегаватта', 'мегаватт', 'мегаватту',
            'мегаваттам', 'мегаваттом', 'мегаваттами', 'мегаватте',
            'мегаваттах', 'мегаватта'),
  'ГВт':   ('гигаватт', 'гигаватт', 'гигаватта', 'гигаватт', 'гигаватту',
            'гигаваттам', 'гигаваттом', 'гигаваттами', 'гигаватте',
            'гигаваттах', 'гигаватта'),
  'Вт':    ('ватт', 'ватт', 'ватта', 'ватт', 'ватту', 'ваттам', 'ваттом',
            'ваттами', 'ватте', 'ваттах', 'ватта'),
  'кГц':   ('килогерц', 'килогерц', 'килогерца', 'килогерц', 'килогерцу',
            'килогерцам', 'килогерцем', 'килогерцами', 'килогерце',
            'килогерцах', 'килогерца'),
  'МГц':   ('мегагерц', 'мегагерц', 'мегагерца', 'мегагерц', 'мегагерцу',
            'мегагерцам', 'мегагерцем', 'мегагерцами', 'мегагерце',
            'мегагерцах', 'мегагерца'),
  'ГГц':   ('гигагерц', 'гигагерц', 'гигагерца', 'гигагерц', 'гигагерцу',
            'гигагерцам', 'гигагерцем', 'гигагерцами', 'гигагерце',
            'гигагерцах', 'гигагерца'),
  'Гц':    ('герц', 'герц', 'герца', 'герц', 'герцу', 'герцам', 'герцем',
            'герцами', 'герце', 'герцах', 'герца'),
  'Дж':    ('джоуль', 'джоулей', 'джоуля', 'джоулей', 'джоулю', 'джоулем',
            'джоулем', 'джоулями', 'джоуле', 'джоулях', 'джоуля'),
  'кДж':   ('килоджоуль', 'килоджоулей', 'килоджоуля', 'килоджоулей',
            'килоджоулю', 'килоджоулем', 'килоджоулем', 'килоджоулями',
            'килоджоуле', 'килоджоулях', 'килоджоуля'),
  'МДж':   ('мегаджоуль', 'мегаджоулей', 'мегаджоуля', 'мегаджоулей',
            'мегаджоулю', 'мегаджоулем', 'мегаджоулем', 'мегаджоулями',
            'мегаджоуле', 'мегаджоулях', 'мегаджоуля'),
  'ГДж':   ('гигаджоуль', 'гигаджоулей', 'гигаджоуля', 'гигаджоулей',
            'гигаджоулю', 'гигаджоулем', 'гигаджоулем', 'гигаджоулями',
            'гигаджоуле', 'гигаджоулях', 'гигаджоуля'),
  '₽':     ('рубль', 'рублей', 'рубля', 'рублей', 'рублю', 'рублям',
            'рублём', 'рублями', 'рубле', 'рублях', 'рубля'),
  '£':     ('фунт стерлингов', 'фунтов стерлингов', 'фунта стерлингов',
            'фунтов стерлингов', 'фунту стерлингов', 'фунтам стерлингов',
            'фунтом стерлингов', 'фунтами стерлингов', 'фунте стерлингов',
            'фунтах стерлингов', 'фунта стерлингов'),
  'а.е.':  ('астрономическая единица', 'астрономических единиц',
            'астрономической единицы', 'астрономических единиц',
            'астрономической единице', 'астрономическим единицам',
            'астрономической единицей', 'астрономическими единицами',
            'астрономической единице', 'астрономических единицах',
            'астрономические единицы'),
  'л.с.':  ('лошадиная сила', 'лошадиных сил', 'лошадиной силы',
            'лошадиных сил', 'лошадиной силе', 'лошадиным силам',
            'лошадиной силой', 'лошадиными силами', 'лошадиной силе',
            'лошадиных силах', 'лошадиные силы'),
  'л':     ('литр', 'литров', 'литра', 'литров', 'литре', 'литрам',
            'литром', 'литрами', 'литре', 'литрах', 'литра'),
  'сек':   ('секунда', 'секунд', 'секунды', 'секунд', 'секунде', 'секундам',
            'секундой', 'секундами', 'секунде', 'секундах', 'секунды'),
  'м²':    ('метр _квадратный', 'метров _квадратных', 'метра _квадратного',
            'метров _квадратных', 'метру _квадратному', 'метрам _квадратным',
            'метром _квадратным', 'метрами _квадратными', 'метре _квадратном',
            'метрах _квадратных', 'метра _квадратных'),
  'мм²':   ('миллиметр _квадратный', 'миллиметров _квадратных',
            'миллиметра _квадратного', 'миллиметров _квадратных',
            'миллиметру _квадратному', 'миллиметрам _квадратным',
            'миллиметром _квадратным', 'миллиметрами _квадратными',
            'миллиметре _квадратном', 'миллиметрах _квадратных',
            'миллиметра _квадратных'),
  'см²':   ('сантиметр _квадратный', 'сантиметров _квадратных',
            'сантиметра _квадратного', 'сантиметров _квадратных',
            'сантиметру _квадратному', 'сантиметрам _квадратным',
            'сантиметром _квадратным', 'сантиметрами _квадратными',
            'сантиметре _квадратном', 'сантиметрах _квадратных',
            'сантиметра _квадратных'),
  'км²':   ('километр _квадратный', 'километров _квадратных',
            'километра _квадратного', 'километров _квадратных',
            'километру _квадратному', 'километрам _квадратным',
            'километром _квадратным', 'километрами _квадратными',
            'километре _квадратном', 'километрах _квадратных',
            'километра _квадратных'),
  'м³':    ('метр _кубический', 'метров _кубических', 'метра _кубического',
            'метров _кубических', 'метру _кубическому', 'метрам _кубическим',
            'метром _кубическим', 'метрами _кубическими', 'метре _кубическом',
            'метрах _кубических', 'метра _кубических'),
  'мм³':   ('миллиметр _кубический', 'миллиметров _кубических',
            'миллиметра _кубического', 'миллиметров _кубических',
            'миллиметру _кубическому', 'миллиметрам _кубическим',
            'миллиметром _кубическим', 'миллиметрами _кубическими',
            'миллиметре _кубическом', 'миллиметрах _кубических',
            'миллиметра _кубических'),
  'см³':   ('сантиметр _кубический', 'сантиметров _кубических',
            'сантиметра _кубического', 'сантиметров _кубических',
            'сантиметру _кубическому', 'сантиметрам _кубическим',
            'сантиметром _кубическим', 'сантиметрами _кубическими',
            'сантиметре _кубическом', 'сантиметрах _кубических',
            'сантиметра _кубических'),
  'км³':   ('километр _кубический', 'километров _кубических',
            'километра _кубического', 'километров _кубических',
            'километру _кубическому', 'километрам _кубическим',
            'километром _кубическим', 'километрами _кубическими',
            'километре _кубическом', 'километрах _кубических',
            'километра _кубических'),
  "'":     ('минута', 'минут', 'минуты', 'минут', 'минуте', 'минутам',
            'минутой', 'минутами', 'минуте', 'минутах', 'минуты'),
  'шт.':   ('штука', 'штук', 'штуки', 'штук', 'штуке', 'штукам',
            'штукой', 'штуками', 'штуке', 'штуках', 'штуки'),
  'М':     ('мах', 'махов', 'маха', 'махов', 'маху', 'махам',
            'махом', 'махами', 'махе', 'махах', 'маха'),
  'ед.':   ('единица', 'единиц', 'единицы', 'единиц', 'единице', 'единицам',
            'единицей', 'единицами', 'единице', 'единицах', 'единицы'),
  'кпк':   ('килопарсек', 'килопарсеков', 'килопарсека', 'килопарсеков',
            'килопарсеку', 'килопарсекам', 'килопарсеком', 'килопарсеками',
            'килопарсеке', 'килопарсеках', 'килопарсека'),
  'Мпк':   ('мегапарсек', 'мегапарсеков', 'мегапарсека', 'мегапарсеков',
            'мегапарсеку', 'мегапарсекам', 'мегапарсеком', 'мегапарсеками',
            'мегапарсеке', 'мегапарсеках', 'мегапарсека'),
  'Гпк':   ('гигапарсек', 'гигапарсеков', 'гигапарсека', 'гигапарсеков',
            'гигапарсеку', 'гигапарсекам', 'гигапарсеком', 'гигапарсеками',
            'гигапарсеке', 'гигапарсеках', 'гигапарсека'),
  'пк':    ('парсек', 'парсеков', 'парсека', 'парсеков', 'парсеку', 'парсекам',
            'парсеком', 'парсеками', 'парсеке', 'парсеках', 'парсека'),
  'уз':     ('узел', 'узлов', 'узла', 'узлов', 'узлу', 'узлам', 'узлом',
             'узлами', 'узле', 'узлах', 'узла'),
  'дБ':    ('децибел', 'децибел', 'децибела', 'децибел', 'децибелу',
            'децибелам', 'децибелом', 'децибелами', 'децибеле',
            'децибелах', 'децибела'),
  'атм':   ('атмосфера', 'атмосфер', 'атмосферы', 'атмосфер', 'атмосфере',
            'атмосферам', 'атмосферой', 'атмосферами', 'атмосфере',
            'атмосферах', 'атмосферы'),
  'га':     ('гектар', 'гектаров', 'гектара', 'гектаров', 'гектару', 'гектарам',
             'гектаром', 'гектарами', 'гектаре', 'гектарах', 'гектара'),
}

# Шаблоны
samples_1 = (
  # Не читать как предлог
  (r'(«В»|„В“|"В")', 'Вэ'),
  (r'(«К»|„К“|"К")', 'Ка'),
  (r'(«С»|„С“|"С")', 'Эс'),

  (r'([‑–−—―]|\uA7F7)', '-'), # Всевозможные знаки, используемые в роли тире
  (r'\u00A0|\u2009|\u202F|_|	', ' '), # Различные виды пробелов
  (r'\uFFFC', ''), # Удаление знака Object Replacement Character
  (r' {2,}', ' '), # Замена нескольких пробелов одним
  (r'(\A|\n) ', r'\1'), # Удаление пробела в начале строки
  (r' (\n|\Z)', r'\1'), # Удаление пробела в конце строки
  ('…', '...'), # Многоточие как один знак не выделяется при чтении паузой
  (r"(°|')(\d{1,2})", r'\1 \2'), # Знак " в значении «угловые секунды»
  (r'''\b([°']) (\d{1,2})"''', r'\1 \2 сек'),
#  (r'\b(\d+[»“”"]) ', r'\1_ '), # Маркер после числительного с кавычкой
  ('[«»„“”"]', ''), # Шаблоны не рассчитаны на присутствие кавычек
  (' ,', ','), # Иногда встречается пробел перед запятой
  # Пустые строки
  (r'(?<=\n)\n', ''),
  (r'(?<=\A)\n', ''),

  (r'(?<=\d )((к|м|с|)м)2\b', r'\1²'),
  (r'(?<=\d )((к|м|с|)м)3\b', r'\1³'),
  (r'\b((\d+,|)\d+)g\b', r'\1 же'), # Ускорение свободного падения

  (r'\b(\d+)/(\d+ (года|годов))\b', r'\1 - \2'),
  (r'(?<=[0-9A-Za-zА-Яа-я])/(?=\d)', '_ дробь _'),

  # Предотвращает чтение числительного как порядкового
  (r'\b([1-9]|1[012]) (утра|дня|вечера|ночи)\b', r'\1 _\2'),

  ('˚', '°'),
  (r'(?<=\d) ?[°º] ?[CС]\b', ' ℃'),
  (r'°K\b', '° Кельвина'), # Устаревшее обозначение
  (r'(?<=\d )Мах(ах?|ами?|е|у|о[вм]|)\b', r'мах\1'),
  (r'(?<=\d) ?‰', ' промилле'),
  ('л\. с\.', 'л.с.'),
  (r'( |)\&\1', ' and '),
  (r'\b(?<=тем более)(?= \d)', '_'), # "тем более" не значит "более"
  (r'(млн|млрд|трлн)\.(?! [А-Я]|\n|\Z)', r'\1'), # Лишняя точка в сокращении

  (r'(?<!\d )\bсм\.', 'смотри'),
  (r'<\.{2,3}>', '(пропущенный фрагмент текста)'),

  # Редкий случай: больше 999 тыс.
  #(r'(?<!,)\b(\d+ ?\d\d\d) тыс\.', r'\1 000'),

  # Диапазон чисел звучит более чётко с пробелами 
  (r'(?<!-)\b(\d+)-(\d+)\b(?!-\d)', r'\1 - \2'),
  (r'\b([IVXХ]+)-([IVXХ]+)\b', r'\1 - \2'),

  # Удаление пробелов между разрядами числа
  (r'(?<![-.])\b(\d{1,3}) (?=\d{3}\b(?!-))', r'\1'),
  (r'(\d+,)((\d{3})+) (\d{1,2}\b)', r'\1\2\4'),

  # В названиях, обозначениях, номерах: правильное чтение букв и числительных
  (r'(?<=[0-9-. ])Б(\d*)\b', r'Бэ\1'),
  (r'\bС(?! |[а-яёА-ЯЁ])', 'Эс'),
  (r'\b(\d*[А-Яа-я]+(-?\d+)([.-]\d*))В\b', r'\1Вэ'),
  (r'\b(\d*[А-Яа-я]+(-?\d+)([.-]\d*))К\b', r'\1Ка'),
  (r'\b(\d*[А-Яа-я]+(-?\d+)([.-]\d*))М\b', r'\1Эм'),
  (r'\b(\d*[А-Яа-я]+(-?\d+)([.-]\d*))С\b', r'\1Эс'),
  (r'\b([А-Яа-я]+[.-])В\b', r'\1Вэ'),
  (r'\b([А-Яа-я]+[.-])К\b', r'\1Ка'),
  (r'\b([А-Яа-я]+[.-]|\d+)С\b', r'\1Эс'),
  (r'(?<![А-Я])В(-?\d)', r'Вэ\1'),
  (r'(?<![А-Я])К(-?\d)', r'Ка\1'),
  (r'(?<![А-Я])М(-?\d)', r'Эм\1'),
  (r'\b([а-яА-Я]+-\d+|\d{3,}) ?М\b', r'\1 Эм'),
  (r'([0-9-])С([0-9-+])', r'\1Эс\2'),
  (r'\b([A-Za-zА-Яа-я]+-\d+) ', r'\1_ '),
  (r'\b([a-zA-Zа-яА-Я]-?\d+) (\D{4,})', r'\1_ \2'),
  (r'\b([Вв] )№№ ?(?=\d+)\b', r'\1номерах _'),
  (r'\b([Вв] )№ ?(?=\d+)\b', r'\1номере _'),
  (r'№№ ?(?=\d+)\b', 'номера _'),
  (r'№ ?(?=\d+)\b', 'номер _'),
  ('№', 'номер'),
  # Римские цифры с буквенными индексами (напр. в названиях)
  (r'\b(I{1,3}|I(V|X)|VI{0,3}|X{1,3}(V|I{1,3}|I(V|X))?)'
   r'([a-zа-я])\b(?!-?\d)', r'\1 \5'),

  # Пропущенная точка
  (r'\b(\d+ тыс)(?!\.)\b', r'\1.'),
  # "с" определенно означает "секунды"
  (r'\b((\d+,|)\d+ ?с)(?=[.,;:)]|\n|\Z)', r'\1ек'),
  # "г" определенно означает "граммы" - добавление маркера
  (r'\b('
   r'(([Вв]ес:?|вес[аеу]|весом|весить?|весил[аио]?|весивш[аеимухюя]{2,3}|'
   r'весящ[аеимухюя]{2,3}|[Мм]асса:?|масс([еуы]|ой))'
   r'( [а-я]+|) (\d+(,\d+|)(-| [-и] | или )|)\d+(,\d+|))|'
   r'\d+,\d+((-| [-и] | или )\d+|)'
   r') ?г\b',
   r'\1 _г'),
  (r'\b(\d+) ?г(?=\n|\Z|[ ,;:)])', r'\1 _г'),

  (r'\b((\d+,|)\d+)G\b', r'\1 G'),
  (r'(?<=\d)(?=[Α-Ωα-ω])', ' '),
  (r'(?<=[Α-Ωα-ω])(?=[Α-Ωα-ω])', ' '),

  (r'(?<=\d)(\)?) ?[×xXхХ] ?(\(?)(?=\d)', r'\1 на \2'),
  (r'\b([Мм]асштаб(|а|е|ом|у) 1):(\d+)\b', r'\1 к \3'),
  (r'\b(\(?-?\d(,\d+|)([-±]\d(,\d+|)|)\)?) на 10\^?(-?\d+)\b',
   r'\1 на 10 в степени \5'), # Без символа ^ неоднозначно
  (r'(?<!\d|,)10\^(-?\d+)\b', r'10 в степени \1'),

  # Предотвращает чтение букв как сокращений единиц измерения 
  (r'([а-яА-Яa-zA-Z]+[-/]?\d+ ?)' + units, r'\1_\2'),
  (r'(\d+ ?)'+ units + '(?=-)', r'\1_\2'),

  (r'\b(\d+)' + units, r'\1 \2'),

  # Точка в десятичных дробях
  (r'\b(\d+)\.(\d+) ' + units, r'\1,\2 \3'),
  (r'\b(\d+)\.(\d+) (тысячи?|(миллион|миллиард|триллион)(а|ов))', r'\1,\2 \3'),
#  (r'((\A|\n|\d| )\b[-+±]\d+)\.(\d+)(?!\.)\b', r'\1,\3'),
#  (r'\b(\d+)\.(\d+[-+±])(?=\d)', r'\1,\2'),
  # Редкий случай, например: 10%-12%. Первое обозначение единиц удаляется
  (r'\b((\d+,|)\d+ ?)([кмс]?м|[км]?г|т|%|°)-((\d+,|)\d+ ?)\3', r'\1 - \4 \3'),

  (r'(\d ?тыс\.)' + units, r'\1 \2'), # Редкий случай
  (r'(\d+|тыс\.|млн|млрд|-й степени) кв\. ?((|к|с|м)м)\b', r'\1 \2²'),
  (r'(\d+|тыс\.|млн|млрд|-й степени) куб\. ?((|к|с|м)м)\b', r'\1 \2³'),
  (r'\b(\d+,\d+ )кв\.( (|кило|милли|санти)метра)\b', r'\1квадратного\2'),
  (r'\b(\d+,\d+ )куб\.( (|кило|милли|санти)метра)\b', r'\1кубического\2'),
  (r'(?<= кв)\.( (|кило|милли|санти)метр(а|ов))\b', r'адратных\1'),
  (r'(?<= куб)\.( (|кило|милли|санти)метр(а|ов))\b', r'ических\1'),
  (r'(?<= кв)\.( (|кило|милли|санти)метр)\b', r'адратный\1'),
  (r'(?<= куб)\.( (|кило|милли|санти)метр)\b', r'ический\1'),

  (r'(?<!\d)(?<!\d )шт\.( [А-Я][а-я]+)\b', r'штат\1'),

  (r'(?<=\d )г\. ?г\.', 'гг.'),
  (r'\b(\d+)(в?в\.|г?г\.)', r'\1 \2'),
  (r'(?<=[IVX])(в?в\.)', r' \1'),

  # Предполагаемый конец предложения: одна точка будет убрана с сокращением
  (r'\b(/барр|в|вв|\d+ ?г|\d+-й г|гг|др|д|п|э|долл|руб|кв|обл|\d+ ?л\.с|'
   r'тыс|ш|шт|чел|ед|рт\. ст)\.( [А-Я][ а-я]+)', r'\1..\2'),

  (r' ?с\. ?ш\.', ' северной широты'),
  (r' ?ю\. ?ш\.', ' южной широты'),
  (r' ?в\. ?д\.', ' восточной долготы'),
  (r' ?з\. ?д\.', ' западной долготы'),

  (r'(?<=долл\.)/барр\.', ' за баррель'),

  (r'\b(с )(МСК|мск)\b', r'\1московским временем'),
  (r'\b(по |)(МСК|мск)\b', 'по московскому времени'),
  (r'\b([А-Я]\.)(?=[А-Я])', r'\1 '), # Пробел для более четкого чтения инициалов
  (r' им\. ((|(|[А-Я]\. )[А-Я]\. )[А-Я][а-яё]+)', r' имени \1'),
  (r'\b(\d+ мм )рт\. ст\.', r'\1ртутного столба'),
  (r'(?<=\d)( ?%-н)(о([ей]|го|му?)|ая|ы(й|х|ми?))\b', r'-процентн\2'),
  (r'\b([Оо]к)\. (\d+)', r'\1оло \2'),
  (r'\b([Бб]олее|[Мм]енее|[Оо]коло)( \d+) чел\.', r'\1\2 человек'),
  (r'\b(\d*[02-9][015-9]|[015-9]|тыс\.|млн|млрд) чел\.', r'\1 человек'),
  (r'\b(\d*[02-9][234]|[234]) чел\.', r'\1 человека'),
  (r'§§ ?\b', r'параграфы '),
  (r'§ ?\b', r'параграф '),
  (r' USD\b', ' $ США'),
  (r'\bдолл\.', '$'),

  (r' ?(⩾|≥|>=) ?', ' больше или равно '),
  (r' ?(⩽|≤|<=) ?', ' меньше или равно '),
  (r' ?(±|\+-) ?', ' плюс-минус '),
  (r' ?= ?', ' равно '),
  (r' ?≠ ?', ' не равно '),
  (r' ?≈ ?', ' приближённо равно '),
  (r' ?> ?', ' больше '),
  (r' ?< ?', ' меньше '),
  (r' ?[∼~](?=\d)', ' около '),
  (r' ?\+ ?', ' плюс '),
  (r'(?<!\w)-(?=\d)', 'минус '),
  (r' ?∆ ?', ' дельта '), # На самом деле символ «конечная разность» (\u2206)

  (r'(?<!\d)(\$|€|£|₽) (?=\d)', r'\1'),
  (r'\$((((\d+,|)\d+|) - |)(\d+,|)\d+) (тыс\.|млн|млрд|трлн)',
   r'\1 \6 долларов'),
  (r'£((((\d+,|)\d+|) - |)(\d+,|)\d+) (тыс\.|млн|млрд|трлн)',
   r'\1 \6 фунтов стерлингов'),
  (r'₽((((\d+,|)\d+|) - |)(\d+,|)\d+) (тыс\.|млн|млрд|трлн)', r'\1 \6 рублей'),
  (r'€((((\d+,|)\d+|) - |)(\d+,|)\d+) (тыс\.|млн|млрд|трлн)', r'\1 \6 евро'),
  (r'(\$|€|£|₽)((((\d+,|)\d+ - )|)(\d+,|)\d+)\b', r'\2 \1'),
  (r' (\$|€|£|₽) (тысяч(|ами|а[мх]?|и)\b|(миллион|миллиард|триллион)'
   r'(|ами|а[мх]?|ов)\b)', r' \2 \1'),
  (r'\bруб\.', '₽'),
  (r'(тыс\.|млн|млрд|трлн|тысяч[аеиумйх]{,3}|миллион[ауеовмих]{,3}|'
   r'миллиард[ауеовмих]{,3}|триллион[ауеовмих]{,3}) ' + units, r'\1 \2'),
  (' €', ' евро'),

  # Неправильные наращения
  (r'(?<=\d-)ая\b', 'я'),
  (r'(?<=\d-)ую\b', 'ю'),
  (r'(?<=\d-)ого\b', 'го'),

  (r'\b(([Дд]о|[Бб]олее|[Бб]ольше|[Ии]з|[Кк]|[Мм]енее|[Мм]еньше|[Оо]т|[Пп]озже|'
   r'[Пп]осле|[Пп]озднее|[Рр]анее|[Рр]аньше|[Сс]) (\d*[02-9]|)[78])-ми', r'\1'),

  (r'\b(по ч\.)( \d+ )(ст\.)( \d+)', r'по части\2статьи\4'),
  (r'\b([Пп]редусмотренн([оы]е|ого|ых|ыми?) )(ч\.)( \d+)( ст\.)( \d+)',
   r'\1частью\4-й статьи\6'),
  (r'\b(ч\.)( \d+)( ст\.)( \d+)', r'часть\2-я статьи\4'),
  (r'\b(([Пп]о|[Сс]огласно) ст)\.(?= \d)', r'\1атье'),
  (r'\b(стать[её]й \d+)', r'\1-й'),
  (r'\b(статью \d+)', r'\1-ю'),
  (r'\b(со ст)\.(?= \d)', r'\1атьёй'),
  (r'\b([Сс]т)\.(?= \d)', r'\1атья'),
#  (r'\b([Чч])(\.|асть)( \d+)(?!,\d)(?!-)\b', r'\1асть\3-я'),
  (r'\bп\.( \d+)\b', r'пункт\1'),
  (r'(([Вв] течение|[Сс]о?|[Дд]о|[Пп]осле) [IV]{1,3} кв)\.', r'\1артала'),
  (r'([Вв]о? [IV]{1,3} кв)\.', r'\1артале'),
  (r'([Кк]о? [IV]{1,3} кв)\.', r'\1арталу'),
  (r'\b([IV]{1,3} кв)\.', r'\1артал'),
  (r'\bкв\.( \d+)', r'квартира\1'),
  (r'\bд\.( \d+)', r'дом\1'),
  (r'\bул\.', 'улица'),
  (r'\bпр(-т|осп\.)', 'проспект'),
  (r'([А-Я][а-яё]+(ая|ую) обл)\.', r'\1асть'),
  (r'([А-Я][а-яё]+ой обл)\.', r'\1асти'),
  (r'\b([Вв] г)\.( [А-Я][а-яё]+)\b', r'\1ороде\2'),
  (r'\b([Бб]лиз|[Вв]близи|[Дд]о|[Ии]з|[Оо]т) г\.( [А-Я][а-яё]+)\b',
   r'\1 города\2'),
  (r'\b(г)\.( [А-Я][а-яё]+)\b', r'\1ород\2'),
  (r'\b([Вв] пос)\.( [А-Я][а-я]+)\b', r'\1ёлке\2'),
  (r'\b([Пп]ос)\.( [А-Я][а-я]+)\b', r'\1ёлок\2'),

  (r'\bP\. ?((P\. ?)*)S\.', r'Пост-\1скриптум.'),
  (r'(P\. ?)(?=(P\. ?)*скриптум.)', 'пост-'),
  (r'\bPS\.', 'Пост-скриптум.'),
  (r'\b[Тт]\. ?е\.', 'то есть'),
  (r' т\. ?д\.', ' так далее'),
  (r' т\. ?п\.', ' тому подобное'),
  (r' т\. ?к\.', ' так как'),
  (r'в т\. ?ч\.', 'в том числе'),
  (r' н\. ?э\.', ' нашей эры'),
  (r' с\. ?г\.', ' сего года'),
  (r'\b[Пп]рим\. авт\.', 'примечание автора'),
  (r'\b[Пп]рим\. ред\.', 'примечание редактора'),
  (r'\b[Пп]рим\. пер(ев|)\.', 'примечание переводчика'),
  (r'\b[Аа]вт\.', 'автор'),
  (r'\b[Рр]ед\.', 'редактор'),
  (r'\b[Пп]рим\.', 'примечание'),
  (r'точк([аеийоу]{1,2}) над i', r'точк\1 над и-'),
  (r'\b([Дд])-(р|ра|ре|ром|ру)\b', r'\1окто\2'),
  (r'\b([Гг])-(н|на|не|ном|ну)\b', r'\1осподи\2'),
  (r'\b([Гг])-(жа|же|жи|жой|жу)\b', r'\1оспо\2'),
  (r'\b([Пп])-ов(а|е|у|ом|)\b', r'\1олуостров\2'),
  (r'\b([Кк]ол)-(ва|ве|во|вом|ву)\b', r'\1ичест\2'),
  (r'\bр-н(|а|е|ом|у)\b', r'район\1'),

  (r'\b[Вв]/ч\b', 'вэ-че'),
  (r'/(сек|с)\b', ' в секунду'),
  (r'/(час|ч)\b', ' в час'),
  (r'(?<!\w|-)(\d+) ?V(?![A-Z/]+)', r'\1 В'),

  (r'\b(?<=[Дд])’([А-Я][а-я]+)\b', r'\1'), # Апостроф во французских именах
  (r'\b[Жж]/д\b', 'жэ-дэ'),

  # (r'(\d)(½|¼|¾|⅕|⅖|⅗|⅘|⅙|⅚|⅐|⅛|⅜|⅝|⅞|⅑)', r'\1 и \2'),
  # ('½', 'одна вторая'),
  # ('⅓', 'одна треть'),
  # ('⅔', 'две трети'),
  # ('¼', 'одна четверть'),
  # ('¾', 'три четверти'),
  # ('⅕', 'одна пятая'),
  # ('⅖', 'две пятых'),
  # ('⅗', 'три пятых'),
  # ('⅘', 'четыре пятых'),
  # ('⅙', 'одна шестая'),
  # ('⅚', 'пять шестых'),
  # ('⅐', 'одна седьмая'),
  # ('⅛', 'одна восьмая'),
  # ('⅜', 'три восьмых'),
  # ('⅝', 'пять восьмых'),
  # ('⅞', 'семь восьмых'),
  # ('⅑', 'одна девятая'),

  (r'\b(\d+)-ю( [а-яё]+ми)\b', r'\1\2'), # Излишнее наращение

  (r'\b([Дд]атир[авеийлмностушщыья]{2,9} \d+(-м|) (или|и|-) \d+)(?!-м)\b',
   r'\1-м'),
  (r'\b([Дд]атир[авеийлмностушщыья]{2,9} \d+)(?!-м)\b', r'\1-м'),
  (r'\b([Дд]атир[авеийлностушщыья]{2,9} \d+-м (или|и|-) \d+-м )гг\.',
   r'\1годами'),
  (r'\b([Дд]атир[авеийлмностушщыья]{2,9} \d+-м ((или|и|-) \d+-м |))г\.',
   r'\1годом'),
  (r'\b([Вв] \d{2,4})(, \d{2,4})((, (а также( в|)|)| и( в|)) \d{2,4}) '
   r'(гг\.|годах\b)', r'\1-м\2-м\3-м годах'),

  (r'([а-я]{3,8} )(\d+) ?- ?([а-я]{3,8} )(\d+-го)', r'\1\2-го \3\4'),

  (r'(месяц(|а|ев|ы) \d+)(?= г\.)', r'\1-го'),
  (r'(месяц(|а|ев|ы) \d+)( [-и] \d+)(?= гг\.)', r'\1-го\3-го'),
  (r'([Мм]ежду \d+)( и \d+)' + months, r'\1-м\2-м \3'),
  (r'([Мм]ежду \d+)' + months + '( и \d+)' + months, r'\1-м \2\3-м \4'),
  (r'([Сс]о? \d+)( (на|по) \d+)' + months, r'\1-го\2-е \4'),
  (r'([Пп]еред \d+)' + months, r'\1-м \2'),
  (r'\b(([Зз]а|[Нн]а) \d+)( - \d+)' + months, r'\1-е\3-е \4'),
  (r'\b([Зз]а|[Нн]а|[Пп]о)( \d+)' + months, r'\1\2-е \3'),
  (r'\b([Кк]о? \d+)' + months, r'\1-му \2'),
  (r'\b([012]?\d|3[01])( [-и] | или )([012]?\d|3[01])' + months,
   r'\1-го\2\3-го \4'),
  (r'\b([012]?\d|3[01])' + months, r'\1-го \2'),
  # Старый стиль
  (r'\b([Сс] \d+) \((\d+)\)( на \d+) \((\d+)\)' + months,
   r'\1-го (\2-го)\3-е (\4-е) \5'),
  (r'( (на|по) \d+) \((\d+)\)' + months, r'\1-е (\3-е) \4'),
  (r'\b([Кк]о? \d+) \((\d+)\)' + months, r'\1-му (\2-му) \3'),
  (r'\b(\d+)( - \d+) \((\d+)( - \d+)\)' + months, r'\1-го\2-го (\3-го\4-го) \5'),
  (r'\b(\d+) \((\d+)\)' + months, r'\1-го (\2-го) \3'),
  # Праздники
  (r'\b8(-е|) Марта\b', 'Восьмое марта'),
  (r'\b1(-е|) Мая\b', 'Первое мая'),
  (r'\b9(-е|) Мая\b', 'Девятое мая'),

  (r'([Сс] \d+)( (на|по) \d+ число)\b', r'\1-го\2'),
  (r'(?<!,)\b(1\d|[23]?[05-9])(?= числа)\b', r'\1-го'),

  (r'\b(([Нн]ачало|[Кк]онец|([Нн]ачал|[Кк]онц)(а|е|ом|у)|[Дд]о|[Пп]осле|'
   r'[Сс]|([Сс]ередин|[Пп]оловин)(а|е|ой|у|ы)) \d+0)( гг\.| годов)',
   r'\1-х годов'),

  (r'\b([Кк] \d+)( - \d+) (годам|гг\.)', r'\1-му\2-му годам'),
  (r'(\d+0-м )(гг\.)', r'\1годам'),
  (r'(-го )гг\.', r'\1годов'),

  (r'\b([ЗзНн]а )(0?[1-9]|[12]\d|3[01])\.(0?[1-9]|1[012])\.((1\d|20|)(\d\d))'
   r'(?!\.\d)\b', r'\1\2-ое \3-го \4-го'), # Наращение -ое преобразуется далее
  (r'\b([Кк] )(0?[1-9]|[12]\d|3[01])\.(0?[1-9]|1[012])\.((1\d|20|)(\d\d))'
   r'(?!\.\d)\b', r'\1\2-му \3-го \4-го'),
  (r'\b(?<!\.)(0?[1-9]|[12]\d|3[01])\.(0?[1-9]|1[012])\.((1\d|20|)(\d\d))'
   r'(?!\.\d)\b', r'\1-го \2-го \3-го'),
  (r'\b([Вв] \d+0)(|-х) (годах|гг\.)', r'\1-х годах'),
  (r'\b([Сс] \d+)(( и|) по \d+) (год\b|г\.)', r'\1-го\2-й год'),
  (r'\b([Сс] \d+)(( и|) по \d+) (годы|гг\.)', r'\1-го\2-й годы'),
  (r'\b(([Оо]т|[Сс]) \d+)( до \d+) г(\.|ода\b)', r'\1-го\3-го года'),
#  (r'\b(([Оо]т|[Сс]) \d+)( до \d+) г(г\.|одов\b)', r'\1-го\3-го годов'),
  (r'\b([Сс] \d+)( на \d+) (год\b|г\.)', r'\1-го\2-й год'),
  (r'\b(\d+)( [-и] \d+)(?= годов\b)', r'\1-го\2-го'),
  (r'\b([Нн]ачало|([Нн]ачал|[Кк]онц)(а|е|ом|у)|([Сс]ередин|половин)(а|е|ой|у|ы)'
   r'|[Кк]онец)( \d{4}\b)(?!-)', r'\1\6-го'),

  (r'([Зз]им([аеуы]|ой) \d+ - \d+) гг\.', r'\1 годов'),
  (r'\b([Яя]нвар[еюьям]{1,2}|[Фф]еврал[еюьям]{1,2}|[Мм]арт[аеуом]{0,2}|'
   r'[Аа]прел[еюьям]{1,2}|[Мм]а[йюяем]{1,2}|[Ии]ю[лн][еюьям]{1,2}|'
   r'[Аа]вгуст[аеуом]{0,2}|[Сс]ентябр[еюьям]{1,2}|[Оо]ктябр[еюьям]{1,2}|'
   r'[Нн]оябр[еюьям]{1,2}|[Дд]екабр[еюьям]{1,2}|[Зз]им[аеуой]{1,2}|'
   r'[Лл]ет[ауом]{1,2}|[Вв]есн[аеуыой]{1,2}|[Оо]сен[иью]{1,2})'
   r'( (того же |)\d{3,4})(?!-го)\b', r'\1\2-го'),
  (r'([Зз]им([аеуы]|ой) \d+-го)( - \d+)(?!-го)\b', r'\1\3-го'),
  (r'\b(\d+-го г)г\.', r'\1одов'),

  (r'\b([Оо]б? \d+) г\.', r'\1 годе'),
  (r'\b([Вв] \d+)(-м|)(((, (а|но) (не |)в)|( или| и)(| в)| -|,) \d+) (году|г\.)',
   r'\1-м\3-м году'),
  (r'\b([Кк] \d+)( (-|или) \d+) (году|г\.)', r'\1-му\2-му году'),
  (r'\b([Вв]( [а-яё]+[ео]м,?| том же|) \d+)( [а-яё]+ом | )(году|г\.)',
   r'\1-м\3году'),
  (r'\b([Кк] (([а-яё]+ |)[а-яё]+[ео]му[,]? |)\d+) (году|г\.)', r'\1-му году'),
  (r'\b([Пп]о \d+)(?= году)\b', r'\1-му'),

  (r'([Нн]ачиная с \d+)( и заканчивая \d+ годом)', r'\1-го\2'),
  (r'(([Мм]ежду|[Пп]о сравнению с) \d+)( [-и] \d+) (гг\.|годами\b)',
   r'\1-м\3-м годами'),
  (r'(([Мм]ежду|[Пп]о сравнению с) \d+)( [-и] \d+) (г\.|годом\b)',
   r'\1-м\3-м годом'),
  (r'([Пп]о сравнению с|[Пп]еред)( ([а-я]+[иы]м |)\d+) (г\.|годом\b)',
   r'\1\2-м годом'),

  (r'([Мм]ежду \d+)( и \d+)( годом| годами)\b', r'\1-м\2-м\3'),

  (r'\b(([Вв]|[Оо])( [а-яё]+[иы]х | )\d+)((,(| в)| -| и(| в)) \d+)(|-м)'
   r'( [а-яё]+[иы]х | )(годах|гг\.)', r'\1-м\4-м\9годах'),
  (r'\b([Вв] \d+)(, \d+)((,| и) \d+) (годах|гг\.)', r'\1-м\2-м\3-м годах'),
  (r'([Оо]коло \d+)( - \d+) гг\.', r'\1-го\2-го годов'),

  (r'\b([Вв] течение|[Дд]о|[Нн]е позднее|[Нн]е ранее|[Оо]коло|[Пп]осле|[Сс])'
   r'( \d+)( (- |или (до |после |с |))\d+) (года\b|г\.)', r'\1\2-го\3-го года'),
  (r'\b([Вв] течение|[Дд]о|[Нн]е позднее|[Нн]е ранее|[Оо]коло|[Пп]осле|[Сс])'
   r'( \d+)((,| -) \d+) (годов\b|гг\.)', r'\1\2-го\3-го годов'),
  (r'\b([Вв] течение|[Дд]ля|[Дд]о|[Нн]е позднее|[Нн]е ранее|[Оо]коло|[Пп]осле'
   r'|[Сс])( \d+)( ?г\.)', r'\1\2-го года'),
  (r'\b([Вв] течение|[Нн]е позднее|[Нн]е ранее|[Оо]коло)'
   r'( \d+)(?= года)\b', r'\1\2-го'),
  (r'(?<= )((1\d|20)[02-9]1)(?= года\b)', r'\1-го'),

  (r'\b(\d+)((,| или| и| -) \d+) (годы|гг\.)', r'\1-й\2-й годы'),
  (r'(?<!,)\b(\d+)((,| или| и| -) \d+) (год\b|г\.)', r'\1-й\2-й год'),

  (r'([Вв]о? [1-4])( (-|и( в|)) [1-4])( кварталах)', r'\1-м\2-м\5'),
  (r'([Вв]о? [1-4])( (-|или( в|)) [1-4])( квартале)', r'\1-м\2-м\5'),
  (r'\b([Сс]о? [1-4])( по [1-4] квартал)', r'\1-го\2'),
  (r'квартал(|а[х]?|ам[и]?|е|ом|у|ы)( \d+) г\.', r'квартал\1\2 года'),

  (r'\b([Дд]о|[Кк]о?|[Пп]осле|[Сс]о?)( \d+)( недел)(е|ей|и)\b', r'\1\2-й\3\4'),
  (r'\b(([Дд]о|[Пп]осле|[Сс]|ранее|позднее) \d+)( числа)\b', r'\1-го\3'),
  (r'\b([Кк] \d+)( числу)\b', r'\1-му\2'),

  (r'\b([Оо]т \d+) г\.', r'\1-го года'),
  (r'(\d+-го )г\.', r'\1года'),
  (r'([Сс] \d+)-м г\.', r'\1 годом'),
  (r'(\d+0)(|-е) гг\.', r'\1-е годы'),
  (r'(\d+0) годы\b', r'\1-е годы'),
  (r'(\d+0-ми )гг\.', r'\1годами'),
  (r'(\d+0-х )гг\.', r'\1годов'),
  (r'\b([Кк] \d{3,4})( (-|или) \d{3,4})( годам)\b', r'\1-му\2-му\4'),

  (r'(\d+) г\.р\.', r'\1-го года рождения'),

  (r'(1\d|[02-9][02-9]|\b[2-9])(| [а-яё]+[иы]й) год\b', r'\1-й\2 год'),
  (r'\b((1\d|20)\d\d)((| [а-яё]+[иы]й) год)\b', r'\1-й\3'), # Спорный шаблон
  (r'\b((0?[1-9]|[12]\d|3[01])\.(0?[1-9]|1[012])\.(\d\d(\d\d)?)) ?г\.',
   r'\1 года'),
  (r'\b(\d+)( ([-и]|или) \d+-го (года|годов))\b', r'\1-го\2'),
  (r'(\d+)(|-й) г\.', r'\1-й год'),

  (r'(?<!,)\b(\d+) (и|или) (\d+)-(го|ми|му|ю|я)\b', r'\1-\4 \2 \3-\4'),
#  (r'(?<![-,])\b(\d+)(?=(, \d+)*, \d+-(го|ми|му|ю|я))', r'\1-\3'),
  (r'(?<!,)\b(\d+0) (и|или|-) (\d+0)-х\b', r'\1-х \2 \3-х'),
  (r'(?<!,)\b(\d+0)(?=(, \d+)*, \d+0-х)', r'\1-х'),

  (r'\b(?<=\d)(?= ранга)\b', '-го'),
  (r'\b(?<=части )(\d+)(?= статьи)\b', r'\1-й'),

  (r'\b([Сс]о?)( \d+)( по \d+) ((тысяче|сто)летие|поколение)\b',
   r'\1\2-го\3-е \4'),
  (r'\b([Вв]о?|[Оо])( \d+) ([-и]|или) (\d+) ((тысяче|сто)лети|поколени(и|ях))',
   r'\1\2-м \3 \4-м \5'),
  (r'\b(гг\.|год(ы|ов|ами?|ах))( \d+ в)\.', r'\1\3ека'),
  (r'\b(([Вв]|[Оо]) \d+)( (-|или(| [во]))( \d+)) в(еке\b|\.)',
   r'\1-м\3-м веке'),
  (r'\b(([Вв]|[Оо]) \d+)( (-|и(| [во])) \d+) в(еках\b|в\.)', r'\1-м\3-м веках'),
  (r'\b(([Вв]|[Оо]) \d+) (в\.|веке\b)', r'\1-м веке'),
  (r'\b([Кк] \d+)(|-му) в(еку\b|\.)', r'\1-му веку'),
  (r'\b([Вв] \d+)( - (начале|середине|конце|(начале|середине|конце|'
   r'(первой|второй|третьей|последней) (половине|трети|четверти))))\b',
   r'\1-м\2'),
  (r'([Дд]о|[Нн]е позднее|[Нн]е ранее|[Оо]коло|[Пп]осле|[Нн]ачиная с|'
   r'[Нн]а протяжении|([Нн]ачал|[Кк]онц)(а|е|ом|у)|[Кк]онец|'
   r'([Сс]ередин|[Пп]оловин)(а|е|ой|у|ы)|трет[иь]|четверт[иь])'
   r'( \d+) в(ека\b|\.)',  r'\1\6-го века'),
  (r'\b([Кк] \d+)( - \d+) в(екам\b|в\.)', r'\1-му\2-му векам'),
  (r'(([Вв] течение|[Дд]о|[Нн]а протяжении|[Пп]осле) \d+)( - \d+) вв\.',
   r'\1-го\3-го веков'),
  (r'(([Вв] течение|[Дд]о|[Нн]а протяжении|[Пп]осле) [IVXІХ]+ - [IVXІХ]+) вв\.',
   r'\1 веков'),
  (r'\b([Сс] \d+)( по \d+) в(ек\b|\.)', r'\1-го\2-й век'),
  (r'\b(([Дд]о|[Пп]осле|[Сс]) \d+)( - \d+) в(еков\b|в\.)', r'\1-го\3-го веков'),
  (r'\b(\d+)( или \d+) в\.', r'\1-й\2-й век'),
  (r'\b(\d+)( [-и] \d+) вв\.', r'\1-й\2-й века'),
  (r'\b(\d+) в\.', r'\1-й век'),

  (r'\b(([Сс]ередин([аеуы]|ой)|[Нн]ачал([аеу]|ом?)|[Кк]онец|конц([аеу]|ом)'
   r'|половин([аеуы]|ой)) [IVXІХ]+ )в\.', r'\1века'),
  (r'\b(([Сс]ередин([аеуы]|ой)|[Нн]ачал([аеу]|ом?)|[Кк]онец|конц([аеу]|ом)'
   r'|половин([аеуы]|ой)) [IVXІХ]+ )вв\.', r'\1веков'),
  (r'\b([Сс]о? [IVXІХ]+ по [IVXІХ]+ )в\.', r'\1век'),
  (r'\b([Сс]о? [IVXІХ]+ по [IVXІХ]+ )вв\.', r'\1века'),
  (r'\b(([Вв]о?|[Оо]) [IVXІХ]+ [-и] [IVXІХ]+ )вв\.', r'\1веках'),
  (r'\b(([Вв]о?|[Оо])( [IVXІХ]+ или|) [IVXІХ]+ )в\.', r'\1веке'),
  (r'\b(([Дд]о|[Пп]осле|[Сс]|[Гг]раниц[аеуы]|[Гг]раницей) '
   r'[IVXІХ]+ [-и] [IVXІХ]+ )вв\.', r'\1веков'),
  (r'\b(([Дд]о|[Пп]осле|[Сс])( [IVXІХ]+ или|) [IVXІХ]+ )в\.', r'\1века'),
  (r'\b([Кк]о? [IVXІХ]+ )в\.', r'\1веку'),
  (r'\b([Кк]о? [IVXІХ]+ - [IVXІХ]+ )вв\.', r'\1векам'),
  (r'\b([Кк]о? [IVXІХ]+ (-|или) [IVXІХ]+ )в\.', r'\1веку'),
  (r'\b([IVXІХ]+ [-и] [IVXІХ]+ )вв\.', r'\1века'),
  (r'\b( год(ами?|ах|ов|ы) [IVXІХ]+ )в\.', r'\1века'),
  (r'\b(([IVXІХ]+ или |)[IVXІХ]+ )в\.', r'\1век'),
  # Калибр оружия
  (r'\b((\d+,|)\d+)-мм '
   r'(([а-я]+[вкмн]([ая]я|[еиоы][ей]|[ую]ю|[ео]го|[ео]му?|'
   r'[иы]ми?|[иы]х|[иы]ми?) ){0,2}'
   r'((автомат|карабин|пистолет(-пулем[её]т[аеиоувмх]{0,3}|)'
   r'|мином[её]т|патрон|пулем[её]т|снаряд)(|ах?|ами?|е|о[вм]|у|ы|)|'
   r'(артустанов|установ|винтов|пуш)(к[аеиу]|ками?|кой|[ео]к)|'
   r'(бомб|гаубиц|мин|ракет|торпед)(|ах?|ами?|е|[ео]й|у|ы)|САУ|ЗСУ|'
   r'оруди(ем?|й|ю|я|ями?))( Дегтяр[её]ва| Калашникова| Макарова'
   r'| Мосина| Симонова| Стечкина| Судаева| Шпагина| ТТ| Узи|))\b',
   r'\3 калибра \1 мм'),
  (r'(?<!\d,)\b(\d+-)мм( (или|и) \d+-мм ([а-я]+-|)[а-я]+[вкн]'
   r'(ая|о[ей]|ого|ому?|ы[ейх]|ыми?))\b', r'\1миллиметров\5\2'),
  (r'(?<!\d,)\b(\d+-)мм( (или|и) \d+-мм [а-я]+[вкн][иы](е|ми?|х))\b',
   r'\1миллиметровы\4\2'),
  (r'(?<!\d,)\b(\d+-)мм'
   r'( ([а-я]+-|)[а-я]+[вкн](ая|о[ей]|ого|ому?|ы[ейх]|ыми?))\b',
   r'\1миллиметров\4\2'),
  (r'(?<!\d,)\b(\d+-)мм( ([а-я]+-|)[а-я]+[вкн][иы](е|ми?|х))\b',
   r'\1миллиметровы\4\2'),
)
samples_2 = (
  # Римские цифры
  (r'(Александр|Иван|Иоанн|Паве?л|П[её]тр|Ф[её]дор|Васили|Лжедмитри|Никола|'
   r'Карл|Людовик|Рамсес|Тутмос)(|а|е|ем|й|ом|у|ю|я) ([IVX]+)\b',
   'm.group(1) + m.group(2) + " " + ordinal(roman2arabic(m.group(3)),'
   ' mu_pad[m.group(2)])'),
  (r'(Анн|Екатерин|Елизавет)(а|е|ой|у|ы) ([IVX]+)',
   'm.group(1) + m.group(2) + " " + ordinal(roman2arabic(m.group(3)), '
   'zh_pad[m.group(2)])'),
  (r'\b([IVX]+)( (династи|[Кк]онференци)(ей|и|ю|я))\b',
   'ordinal(roman2arabic(m.group(1)), zh_pad[m.group(4)]) + m.group(2)'),
  (r'\b([Гг]лав(а|е|ой|у|ы) )([IVXCL]+)\b',
   'm.group(1) + ordinal(roman2arabic(m.group(3)), zh_pad[m.group(2)])'),
  (r'\b([Сс]тать(я|е|ей|ю|и) )([IVXCL]+)\b',
   'm.group(1) + roman2arabic(m.group(3))'),
  (r'\b([IV]+)( и [IV]+ степени)',
   'ordinal(roman2arabic(m.group(1)), "r_zh") + m.group(2)'),
  (r'\b([IV]+)(?= степени)',
   'ordinal(roman2arabic(m.group(1)), "r_zh")'),
  (r'\b([IVX]+)( или [IVX]+ век(|а|е|ом|у))\b',
   'ordinal(roman2arabic(m.group(1)), mu_pad[m.group(3)]) + m.group(2)'),
  (r'\b([IVX]+)( или [IVX]+ (сто|тысяче)лети(ем?|и|ю|я))\b',
   'ordinal(roman2arabic(m.group(1)), sr_pad[m.group(4)]) + m.group(2)'),
  (r'\b([Оо]т )([IVX]+)( до [IVX]+ (века|веков|столети[йя]|тысячелети[йя]))\b',
   'm.group(1) + ordinal(roman2arabic(m.group(2)), "r_mu") + m.group(3)'),
  (r'\b(?<= по )([IVX]+)(?= века)\b',
   r'ordinal(roman2arabic(m.group(1)), "i_mu")'),
  (r'\b(?<= по )([IVX]+)( (сто|тысяче)летия)\b',
   r'ordinal(roman2arabic(m.group(1)), "i_sr") + m.group(2)'),
  (r'\b([Сс]о? )([IVX]+) по ',
   r'm.group(1) + roman2arabic(m.group(2)) + "-го по "'),
  (r'\b([IVX]+) или ([IVX]+)( (тысячелети|столети|поколени)и)\b',
   'ordinal(roman2arabic(m.group(1)), "p_sr") + " или " + '
   'ordinal(roman2arabic(m.group(2)), "p_sr") + m.group(3)'),
  (r'\b([IVX]+)( (тысячелети|столети|поколени)(ем?|я|ю|и))\b',
   'ordinal(roman2arabic(m.group(1)), sr_pad[m.group(4)]) + m.group(2)'),
  (r'\b([IVX]+)( (век|квартал|класс|пункт|ранг|созыв|[Сс]ъезд|саммит|тип)'
   r'(|а|е|у|ом))\b',
   'ordinal(roman2arabic(m.group(1)), mu_pad[m.group(4)]) + m.group(2)'),
  (r'\b([IVX]+)( ((зим|лет)н(ей|юю|яя) |)Олимпиад(а|е|у|ы|ой))\b',
   'ordinal(roman2arabic(m.group(1)), zh_pad[m.group(6)]) + m.group(2)'),
  (r'\b([Вв]о? )([IVX]+)( - (начале|середине|конце|'
   r'(первой|второй|третьей|последней) (половине|трети|четверти)))\b',
   'm.group(1) + ordinal(roman2arabic(m.group(2)), "p_mu") + m.group(3)'),
  (r'\b([Дд]о|[Нн]е позднее|[Нн]е ранее|[Оо]коло|[Пп]осле|[Нн]ачиная с|'
   r'[Нн]а протяжении|([Нн]ачал|[Кк]онц)(а|е|ом|у)|'
   r'[Кк]он(ец|ц[аеу]|цом)|[Нн]ачал(ом?|е|а|у)|'
   r'([Сс]ередин|[Пп]оловин)(а|е|ой|у|ы)|трет[иь]|четверт[иь]) ([IVX]+) ',
   'm.group(1) + " " + ordinal(roman2arabic(m.group(8)), "r_mu") + " "'),
  (r'\b([Чч]асть )([IVX]+)\b',
   'm.group(1) + ordinal(roman2arabic(m.group(2)), "i_zh")'),
  (r'([A-Z][a-z]*[ -.]|[А-Я][а-я]*[ -.])([IVX]+)($|\n|[.,;:!?)]| [^a-z])',
   'm.group(1) + roman2arabic(m.group(2)) + "_" + m.group(3)'), # в названиях
  (r'(?<![-.])\b([IVX]+)( [А-Я]?[а-яё]+([иы]([ейх]|ми?)|'
   r'[ая]я|[ео](му?|го|[ей])|[ую]ю) ([А-Я]?[а-я]+))\b',
   'ordinal(roman2arabic(m.group(1)), adj_pad[m.group(3)]) + m.group(2)'),
  (r'(?<=\A)([IVX])(\.?\n)', 'roman2arabic(m.group(1)) + m.group(2)'),
  (r'(?<=\n)([IVX])(\.?\n)', 'roman2arabic(m.group(1)) + m.group(2)'),
  # Порядковые числительные - даты и т. д.
  (r'\b(\d+)(( (или|[-и]) \d+) сутки)',
   'ordinal(m.group(1), "i_mn") + m.group(2)'),
  (r'\b([ЗНзн]а )(0?[1-9]|[12]\d|3[01])\.(0?[1-9]|1[012])\.(\d\d(\d\d)?)\b',
   'm.group(1) + ordinal(m.group(2), "i_sr") + " " + '
   'ordinal(m.group(3), "r_mu") + " "  + ordinal(m.group(4), "r_mu")'),
  (r'\b([Кк] )([0-3]?\d)\.([012]?\d)\.(\d\d(\d\d)?)\b',
   'm.group(1) + ordinal(m.group(2), "d_sr") + " " + '
   'ordinal(m.group(3), "r_mu") + " "  + ordinal(m.group(4), r_mu)'),
  (r'\b((1\d|20)\d\d)(?= года\b)', 'ordinal(m.group(1), "r_mu")'),
  (r'\b([Дд]атир[авеийлностушщыья]{2,9} \d+-м( [-и] | или ))(\d+)-м\b',
   'm.group(1) + ordinal(m.group(3), "t_mu")'),
  (r'\b([Дд]атир[авеийлностушщыья]{2,9} )(\d+)-м\b',
   'm.group(1) + ordinal(m.group(2), "t_mu")'),
  (r'\b([А-Я]?[а-я]+[иы]е |[Вв]се )([1-9]0)-е\b',
   'm.group(1) + ordinal(m.group(2), "i_mn")'),
  (r'\b([1-4])' # В названиях фронтов РККА (1941-1945)
   r'( (Белорусск|Дальневосточн|Прибалтийск|Украинск)([иы][йм]|ого|ому?))\b',
   'ordinal(m.group(1), adj_pad[m.group(4)]) + m.group(2)'),
  (r'\b(\d*1\d|\d*[02-9]?[02-9])( (век|квартал|класс|[Сс]ъезд|тип|форум|этаж)'
   r'(|е|ом|у))\b', 'ordinal(m.group(1), mu_pad[m.group(4)]) + m.group(2)'),
#  (r'\b(\d*1\d|\d*[02-9]?[05-9])'
#   r'( (век|квартал|класс|[Сс]ъезд|тип|форум|этаж)а)\b',
#   'ordinal(m.group(1), r_mu) + m.group(2)'),
  (r'(\d+)( зимни[еимх]{1,2}| летни[еимх]{1,2}|)( Олимпийски)(е|ми|м\b|х)\b',
   'ordinal(m.group(1), mn_pad[m.group(4)]) + m.group(2) + m.group(3) + '
   'm.group(4)'),
  (r'\b(\d+)-м( [-и] )(\d+)-м(?= годами)',
   'ordinal(m.group(1), "t_mu") + m.group(2) + ordinal(m.group(3), "t_mu")'),
  (r'\b(\d+0)( (-|и|или) \d+0-е годы)',
   'ordinal(m.group(1), "i_mn") + m.group(2)'),
  (r'\b(\d+0)-е(?= годы)', 'ordinal(m.group(1), "i_mn")'),
  (r'\b([А-Я]?[а-яё]+[иы]е )(\d+0)-е\b',
   'm.group(1) + ordinal(m.group(2), "i_mn")'),
  (r'\b([Кк] )(\d+0)-м\b', 'm.group(1) + ordinal(m.group(2), "d_mn")'),
  (r'\b([Мм]ежду )(\d+) и (\d+) ((тысяче|сто)лети|поколени(ем|ями))',
   'm.group(1) + ordinal(m.group(2), "t_mu") + " и " + '
   'ordinal(m.group(3), "t_mu") + " " + m.group(4)'),
  (r'\b(\d+)( [-и] )(\d+) ((тысяче|сто)летия|поколения)\b',
   'ordinal(m.group(1), "i_sr") + m.group(2) + ordinal(m.group(3), "i_sr") + '
   '" " + m.group(4)'),
  (r'\b(11|[02-9])( ((тысяче|сто)лети|поколени)(е|и|ем|ю))\b',
   'ordinal(m.group(1), sr_pad[m.group(5)]) + m.group(2)'),
  (r'([02-9]?[5-90]|1\d) (столетия|тысячелетия|поколения)\b',
   'ordinal(m.group(1), "r_sr") + " " + m.group(2)'),
  (r'\b(\d+)-й(?= [А-Я]?[а-яё]+[иы]й)\b', 'ordinal(m.group(1), "i_mu")'),
  (r'\b(\d+)-е(?= [А-Я]?[а-яё]+[ео]е)\b', 'ordinal(m.group(1), "i_sr")'),
  (r'\b(\d+0)( - \d+0-м годам)', 'ordinal(m.group(1), "d_mn") + m.group(2)'),
  (r'\b(\d+0)-м( годам| числам)\b', 'ordinal(m.group(1), "t_mu") + m.group(2)'),
  (r'\b([Вв] )(\d+0)-е\b', 'm.group(1) + ordinal(m.group(2), "i_mn")'),
  (r'\b((19|20)\d0)-е\b', 'ordinal(m.group(1), "i_mn")'),
  (r'\b([Вв]о? |[Нн]а |[Сс]квозь |[Чч]ерез )(\d+)-ю\b',
   'm.group(1) + ordinal(m.group(2), "v_zh")'),
  (r'\b(([Вв]о?|[Нн]а|[Оо]б?|[Пп]ри)( [а-яё]+[иы]х | ))'
   r'(\d+)(|-м)( ?- ?| или | и )(\d+)-м\b',
   'm.group(1) + ordinal(m.group(4), "p_mu") + m.group(6) + '
   'ordinal(m.group(7), "p_mu")'),
  (r'\b(([Вв]о?|[Нн]а|[Оо]б?|[Пп]ри) \d+-м, )(\d+)-м\b',
   'm.group(1) + ordinal(m.group(3), "p_mu")'),
  (r'\b([Вв]о?|[Нн]а|[Оо]б?|[Пп]ри)( [а-яё]+[ео]м | э?том же | )(\d+)-м\b',
   'm.group(1) + m.group(2) + ordinal(m.group(3), "p_mu")'),
  (r'\b(([Зз]а|[Нн]ад|[Пп]еред|[Пп]од|[Сс]о?) \d+-м ([-и]|или) )(\d+)-м\b',
   'm.group(1) + ordinal(m.group(4), "t_mu")'),
  (r'\b(([Зз]а|[Нн]ад|[Пп]еред|[Пп]од|[Сс]о?) \d+-й ([-и]|или) )(\d+)-й\b',
   'm.group(1) + ordinal(m.group(4), "t_zh")'),
  (r'\b([Зз]а|[Нн]ад|[Пп]еред|[Пп]од|[Сс]о?) (\d+)-м\b',
   'm.group(1) + " " + ordinal(m.group(2), "t_mu")'),
  (r'\b([Зз]а|[Нн]ад|[Пп]еред|[Пп]од|[Сс]о?) (\d+)-й\b',
   'm.group(1) + " " + ordinal(m.group(2), "t_zh")'),
  (r'\b((19|20)\d\d)-й\b', 'ordinal(m.group(1), "i_mu")'),
  (r'\bпо ([0-3]?\d)-е\b', r'"по " + ordinal(m.group(1), "i_sr")'),
  (r'\b([Нн]оч[иь] со? [0-3]?\d)(-го|) на ([0-3]?\d)(-е|)\b',
   r'm.group(1) + "-го на " + ordinal(m.group(3), "i_sr")'),
  (r'\b(\d+)-му\b', 'ordinal(m.group(1), "d_mu")'),
  (r'\b(\d+)-го\b', 'ordinal(m.group(1), "r_mu")'),
  (r'\b(\d+)-ми\b', 'ordinal(m.group(1), "t_mn")'),
  (r'\b([Мм]ежду )(\d+)-м и (\d+)-м\b',
   'm.group(1) + ordinal(m.group(2), "t_mu") + " и " + '
   'ordinal(m.group(3), "t_mu")'),
  (r'\b([Мм]ежду )(\d+)-й и (\d+)-й\b',
   'm.group(1) + ordinal(m.group(2), "t_zh") + " и " + '
   'ordinal(m.group(3), "t_zh")'),
  (r'\b([Мм]ежду )(\d+)-м(?= и )', 'm.group(1) + ordinal(m.group(2), "t_mu")'),
  (r'\b([Мм]ежду )(\d+)-й(?= и )', 'm.group(1) + ordinal(m.group(2), "t_zh")'),
  # Формы r_mn и p_mn совпадают
  (r'\b(\d*1\d|\d*[02-9][015-9]|[015-9])-ы?х\b', 'ordinal(m.group(1), "r_mn")'),
  (r'\b([Дд]о|[Кк]о?|[Пп]осле|[Оо]т|[Сс]о?) (\d+)-й\b',
   'm.group(1) + " " + ordinal(m.group(2), "r_zh")'),
  (r'\b(\d+)( [-и] )(\d+)( годами| веками| (сто|тысяче)летиями)',
   'ordinal(m.group(1), "t_mu") + m.group(2) + '
   'ordinal(m.group(3), "t_mu") + m.group(4)'),
  (r'\b(\d+)-м (годах|веках|столетиях|тысячелетиях)',
   'ordinal(m.group(1), "p_mu") + " " + m.group(2)'),
  (r'\b(([ВвОо]|[Нн]а|[Пп]ри) [а-яё]+ )(\d+)-м\b',
   'm.group(1) + ordinal(m.group(3), "p_mu")'),
  (r'\b(\d+)-я\b', 'ordinal(m.group(1), "i_zh")'),
  (r'\b(\d+)-ю\b', 'ordinal(m.group(1), "v_zh")'),
  (r'\b(\d+)( годовщин([аейоуы]{1,2}))\b',
   'ordinal(m.group(1), zh_pad[m.group(3)]) + m.group(2)'),
  (r'\b(\d+)-й (или|и|-) (\d+)-й( годы?)\b',
   'ordinal(m.group(1), "i_mu") + " " + m.group(2) + " " + '
   'ordinal(m.group(3), "i_mu") + m.group(4)'),
  (r'\b(\d+)-й(?= годы)\b', 'ordinal(m.group(1), "i_mu")'),
  (r'\b(\d+)-е \((\d+)-е\)' + months, r'ordinal(m.group(1), "i_sr") + " (" + '
   r'ordinal(m.group(2), "i_sr") + ") " + m.group(3)'), # старый стиль
  (r'\b(\d+)-е( - \d+-е)' + months,
   'ordinal(m.group(1), "i_sr") + m.group(2) + " " + m.group(3)'),
  (r'\b(\d+)-е' + months, 'ordinal(m.group(1), "i_sr") + " " + m.group(2)'),
  (r'\b([Мм]ежду )(\d+)-м' + months + '( и )(\d+)-м' + months,
   'm.group(1) + ordinal(m.group(2), "t_mu") + " " + m.group(3) + '
   'm.group(4) + ordinal(m.group(5), "t_mu") + " " + m.group(6)'),
  (r'\b(\d+)-[еи] сутки', 'ordinal(m.group(1), "i_mn") + " сутки"'),
#  (r'\b([Пп]ункт(|а|е|у|ом) )(\d+)\b(?!-й|-м|, ?\d)',
#   'm.group(1) + ordinal(m.group(3), mu_pad[m.group(2)])'),
  (r'\b([Пп]ункт )(\d+)-й\b', 'm.group(1) + ordinal(m.group(2), "i_mu")'),
  (r'\b([Пп]ункт(е|ом) )(\d+)-м\b',
   'm.group(1) + ordinal(m.group(3), mu_pad[m.group(2)])'),
  (r'\b([Сс]тать(я|е|и|ю|ей) )(\d+)\b(?!, ?\d)(-й|)',
   'm.group(1) + ordinal(m.group(3), zh_pad[m.group(2)])'),
  (r'\b([Гг]лав(а|е|ы|у|ой) )(\d+)\b(?!, ?\d)(-й|)',
   'm.group(1) + ordinal(m.group(3), zh_pad[m.group(2)])'),
  (r'\b(\d+)-й\b', 'ordinal(m.group(1), "i_mu")'),
  (r'\b(3|\d*[02-9]3)-е\b', 'ordinal(m.group(1), "i_sr")'),
  # Неправильные наращения, но... полезные
  (r'\b(\d+)-[ео]й\b', 'ordinal(m.group(1), "r_zh")'),
  (r'\b(\d+)-[ео]м\b', 'ordinal(m.group(1), "p_mu")'),
  (r'\b(\d+)-[иы]м\b', 'ordinal(m.group(1), "t_mu")'),
  (r'\b(\d+)-[иы]й\b', 'ordinal(m.group(1), "i_mu")'),
  (r'\b(\d+)-[иы]е\b', 'ordinal(m.group(1), "i_mn")'),
  (r'\b(\d+)-ое\b', 'ordinal(m.group(1), "i_sr")'),
  # Десятичные дроби
  (r'\b(([Зз]а|[Нн]а|состав[аеилотя]{2,4}) (\d+,|)\d+ (-|или|и) )(\d+),(\d+)\b',
   'm.group(1) + decimal(m.group(5), m.group(6), 5)'),
  (r'\b([Зз]а |[Нн]а |состав[аеилотя]{2,4} )(\d+),(\d+)\b',
   'm.group(1) + decimal(m.group(2), m.group(3), 5)'),
  (r'\b(\d+),(\d+)(\b|\Z)', 'decimal(m.group(1), m.group(2)) + m.group(3)'),
  # Количественные числительные
  (r'\b([Вв] районе|[Пп]озднее|[Пп]озже|[Рр]анее|[Рр]аньше|[Сс]) '
   r'([1-9]|1[012]|2[0-4])( утра| дня| вечера| ночи| пополудни| пополуночи)\b',
   'm.group(1) + " " + cardinal(m.group(2), r_ca) + m.group(3)'),
  (r'\b(\d+) (сутки|суток)',
   'daynight(m.group(1), m.group(2)) + " " + m.group(2)'),
  # Предлог "по" при указании количества
  (r'\b([Пп]о )(\d*[02-9]1(\d\d\d)*|1(\d\d\d)*)(?!-)(?!,\d)\b',
   'm.group(1) + cardinal(m.group(2), d_ca)'),
  # Наращения при количественных числительных недопустимы, но распространены
  (r'\b([5-9]|\d*[02-9][05-9]|\d*1\d])-и\b', 'cardinal(m.group(1), r_ca)'),
  (r'\b(\d*[1235-8]0|\d*1\d|(\d*[02-9]|)[569])-[т]?и\b',
   'cardinal(m.group(1), r_ca)'),
  (r'\b((\d*[02-9]|)[234])-мя\b', 'cardinal(m.group(1), t_ca)'),
  (r'\b(\d*[02-9]?[234])-х\b', 'cardinal(m.group(1), r_ca)'),
  (r'(\d+)-ю ([а-яё]+ми)\b', 'cardinal(m.group(1), t_ca) + " " + m.group(2)'),
  (r'\b([Сс]о? )(\d*1[0-4]|\d*\d[5-9]|[5-9])-ю\b',
   'm.group(1) + cardinal(m.group(2), t_ca)'),
)
samples_3 = (
  # Заголовки как правило не заканчиваются знаком препинания,
  # что приводит к слитному чтению со следующей строкой.
  # Не требуется при использовании со Speech Dispatcher
  (r'(?<![.,:;!?-]|\*|\n)(?<!\A)(?=\n)', r'.'),

  (r'\b(?<=[Мм])-(?=да)\b', ''), # Междометие "м-да"
  (r'ВКП\(б\)', 'вэкапэ-бэ'),
  (r'\bИИ\b', 'и- и-'),
  (r'\b(\d{3,}|[3-9]\d|2[5-9])\.(\d|\d{3,}|[6-9]\d)', r'\1-точка-\2'),

  (r'\b((кило|милли|санти|)метр(ами?|ах?|е|у|ов|)) _'
   r'(квадратн(ы[йх]|ыми?|ого|ом)|кубическ(и[йх]|ими?|ого|ом))\b', r'\4 \1'),

  # Предотвращает неверное ударение
  (r'\b([Аа]нти)(?!ква|чн|под|-)', r'\1-'),
  (r'\b([Аа]виа)(?!ци)(?!нос)(?!тор)', r'\1-'),
  (r'\b([Сс]верх)([а-яё]{3,})\b', r'\1-\2'),
  ('ноафриканск', 'но-африканск'),
  (r'\b([Пп]севдо)(?!ним)', r'\1-'),
  (r'\b([Кк]вази|[Сс]упер)([а-я]+)\b', r'\1-\2'),

  # Замена "е" на "ё" по сложному шаблону
  (r'\b[Вв]се-таки\b', 'всё-таки'),
  (r'(\A|\n|\(|\. )Звезды', r'\1Звёзды'),
  (r'\b([Сс])е(стры [а-я]+(ли|[ую]т))\b', r'\1ё\2'),
  (r'\b([Вв]с)е( [а-я]+[еошщ]е)\b', r'\1ё\2'), # недостаточно проверено
  (r'\b([Вв]с)е(( ещ[её]| это| только|) [а-яё]+([еёи]т|[аеиы]ло)(|с[ья]))\b',
   r'\1ё\2'),
  (r'\b([Вв]о|[Нн]а|[Оо]бо|[Пп]ри) всем([\):;.,]|\Z| [а-я]+(е|ии|[ео]м)| -)\b',
   r'\1 всём\2'),
  (r'(?<=\bТ|\bт)емно-(?!темно\b)', 'ёмно-'),

  # Немецкие названия
  (r'\bBerliner Zeitung\b', 'Берлинер Цайтунг'),
  (r'\bDer(?= [A-ZÄÖÜ][a-zäöü]+)', 'Дэр'),
  (r'\bDeutsche Bank\b', 'Дойче Банк'),
  (r'\bDie Zeit\b', 'Ди Цайт'),
  (r'\bFrankfurter Allgemeine Zeitung\b', 'Франкфуртэр Альгемайне Цайтунг'),
  (r'\bStern\b', 'Штэрн'),
  (r'\bDie Welt\b', 'Ди Вэльт'),
  (r'\bBild\b', 'Бильд'),
  (r'\bSüddeutsche Zeitung\b', 'Зюд-дойче Цайтунг'),
  (r'\bVolkswagen\b', 'Фольксваген'),
  (r'\bMercedes-Benz\b', 'Мерседес-Бенц'),

  # Необязательное удаление маркера (используются при обработке)
  ('_', ''),
)

def stress_marker_samples(marker):
    """
    Ударение с использованием маркера.
    Формирует список шаблонов с учётом указанного маркера ударения.
    (параметр "stress_marker=<marker>" должен быть указан в RHVoice.conf)
    """
    return (
        (r'(?<=\b[Ии]з-под земл)(?=и\b)', r'%s' % marker),
        (r'(?<!\A)(?<!\n)(?<!\()(?<!\. )(Земл)и\b', r'\1%sи' % marker),
        (r'\b([Бб]ог)(аче [а-яё]+[иы]х)\b', r'\1%s\2' % marker),
        (r'([234] час)а\b', r'\1%sа' % marker),
        (r'\b([А-Я]?[а-я]+-)дневн', r'\1дн%sевн' % marker),
        (r'\b([Ии]з-под вод)(ы)\b', r'\1%s\2' % marker),
        (r'\b([Сс]о? ([а-яё-]+ |)сторон)ы\b', r'\1%sы' % marker),
        (r'\bс(амом [а-яё]+[ео]м)\b', r'с%s\1' % marker),
        (r'\b([Нн]а (е[её] |его |)борт)у\b', r'\1%sу' % marker),
        (r'\b(начал)(а ([а-яё]+ |)[а-я]+[аеиуя]ть(ся|))\b', r'\1%s\2' % marker),
        (r'\b([Сс]т)(оит ([а-я]+ |)[а-я]+(ться|ть|тись|ти))\b',
         r'\1%s\2' % marker),
        (r'\b([А-Я]?[а-яё]+[аеиуя]ть (|не )ст)оит\b', r'\1%sоит' % marker),
        (r'([Ии]з-за войн)ы', r'\1%sы' % marker),
        (r'([Пп]олн)ым-полно', r'\1%sым-полн%sо' % (marker, marker)),
        (r'(-на-Дон)у\b', r'\1%sу' % marker),
        (r'(-обр)(азн)', r'\1%s\2' % marker),
        (r'([Сс]мотр)(ите, (как|[кч]то))', r'\1%s\2' % marker),
        (r'\b([Гг])(оре-[а-яё]+)\b', r'\1%s\2' % marker),
        (r'([Сс])(амому [а-яё]+[ео]му)\b', r'\1%s\2' % marker),
        (r'([Сс])(амого [а-яё]+[ео]го)\b', r'\1%s\2' % marker),
        (r'([Сс])(амой [а-яё]+[ео]й)\b', r'\1%s\2' % marker),
        (r'(?<=\b[Бб])(ольш(и[емх]|ая|ую)( [а-яё]+|), чем )', r'%s\1' % marker),
        (r'\b([Нн]ачал)(о [а-я]+[аеиуыя]ть(ся|))\b', r'\1%s\2' % marker),
        (r'(?<=\b[Сс]в)(етло-)(?!светло\b)', r'%s\1' % marker),
        ('а́', marker + 'а'),
        ('е́', marker + 'е'),
        ('и́', marker + 'и'),
        ('о́', marker + 'о'),
        ('у́', marker + 'у'),
        ('ы́', marker + 'ы'),
        ('ю́', marker + 'ю'),
        ('я́', marker + 'я'),
        (r'\bDeutsche Welle\b', 'Дойче В%sэле' % marker),
        (r'\bDer Spiegel\b', 'Дэр Шп%sигель' % marker),
        (r'\bSpiegel\b', 'Шп%sигель' % marker),
        (r'\bFrankfurter Allgemeine\b',
         'Фр%sанкфуртэр %sАльгемайне' % (marker, marker)),
        (r'\bFrankfurter Rundschau\b',
         'Фр%sанкфуртэр Р%sундшау' % (marker, marker)),
        (r'\bHandelsblatt\b', 'Х%sандэльсблат' % marker),
        (r'\bTagesspiegel\b', 'Т%sагес-шп%sигель' % (marker, marker)),
        )

# словарь греческого алфавита
greekletters = {
                'альфа':    ('Α', 'α'),
                'бета':     ('Β', 'β'),
                'гамма':    ('Γ', 'γ'),
                'дельта':   ('Δ', 'δ'),
                'эпсилон':  ('Ε', 'ε'),
                'дзета':    ('Ζ', 'ζ'),
                'эта':      ('Η', 'η'),
                'тета':     ('Θ', 'θ'),
                'йота':     ('Ι', 'ι'),
                'каппа':    ('Κ', 'κ'),
                'лямбда':   ('Λ', 'λ'),
                'мю':       ('Μ', 'μ'),
                'ню':       ('Ν', 'ν'),
                'кси':      ('Ξ', 'ξ'),
                'омикрон':  ('Ο', 'ο'),
                'пи':       ('Π', 'π'),
                'ро':       ('Ρ', 'ρ'),
                'сигма':    ('Σ', 'σ', 'ς'),
                'тау':      ('Τ', 'τ'),
                'ипсилон':  ('Υ', 'υ'),
                'фи':       ('Φ', 'φ'),
                'хи':       ('Χ', 'χ'),
                'пси':      ('Ψ', 'ψ'),
                'омега':    ('Ω', 'ω')
               }

# pre_acc + в + числительное -> винительный падеж
pre_acc = ('вероятность', 'вероятности', 'вероятностью',
           'высота', 'высоты', 'высоте', 'высоту', 'высотой',
           'глубина', 'глубины', 'глубине', 'глубину', 'глубиной',
           'глубин', 'глубинах', 'глубинам', 'глубинами',
           'дальность', 'дальности', 'дальностью',
           'диаметр', 'диаметра', 'диаметре', 'диаметру', 'диаметром',
           'дистанция', 'дистанции', 'дистанцией', 'дистанцию',
           'длина', 'длины', 'длине', 'длину', 'длиной',
           'значение', 'значения', 'значением', 'значении', 'значению',
           'интервал', 'интервала', 'интервале', 'интервалу', 'интервалом',
           'максимум', 'максимума', 'максимуме', 'максимуму', 'максимумом',
           'минимум', 'минимума', 'минимуме', 'минимуму', 'минимумом',
           'ограничение', 'ограничения', 'ограничением', 'ограничении', 'ограничению',
           'отметка', 'отметки', 'отметке', 'отметку', 'отметкой',
           'отклонение', 'отклонения', 'отклонением', 'отклонении', 'отклонению',
           'планка', 'планки', 'планке', 'планку', 'планкой',
           'показатель', 'показателя', 'показателе', 'показателю', 'показателем',
           'порог', 'порога', 'пороге', 'порогу', 'порогом',
           'потолок', 'потолка', 'потолке', 'потолку', 'потолком',
           'предел', 'предела', 'пределе', 'пределу', 'пределом',
           'протяжённость', 'протяжённости', 'протяжённостью',
           'радиус', 'радиуса', 'радиусе', 'радиусу', 'радиусом',
           'разница', 'разницы', 'разнице', 'разницу', 'разницей',
           'расстояние', 'расстояния', 'расстоянии', 'расстоянию', 'расстоянием',
           'рекорд', 'рекорда', 'рекорде', 'рекорду', 'рекордом',
           'скорость', 'скорости', 'скоростью',
           'толщина', 'толщины', 'толщине', 'толщину', 'толщиной',
           'точность', 'точности', 'точностью',
           'уверенность', 'уверенности', 'уверенностью',
           'удаление', 'удаления', 'удалении', 'удалению', 'удалением',
           'уровень', 'уровня', 'уровне', 'уровню', 'уровнем',
           'фронт', 'фронта', 'фронте', 'фронтом', 'фронту',
           'ширина', 'ширины', 'ширине', 'ширину', 'шириной', 'оцениваю',
           'оценить', 'оценивать', 'оценил', 'оценила', 'оценили', 'оценивал',
           'оценивала', 'оценивали', 'оценивают', 'оценивает', 'оценю','оценит',
           'оценим', 'оцените', 'оценят', 'оценив', 'оценивая', 'оценивается',
           'оценишь', 'оцениваться', 'оцениваются', 'оценивался', 'оценивалась',
           'оценивалось', 'оценивались', 'оцениваемый', 'оцениваемая',
           'оцениваемое', 'оцениваемую', 'оцениваемые', 'оцениваемой',
           'оцениваемого', 'оцениваемому', 'оцениваемым', 'оцениваемых',
           'оцениваемых', 'оцениваемым', 'оцениваемыми', 'оцененный',
           'оцененная', 'оцененное', 'оцененные', 'оцененным', 'оцененными',
           'оцененного', 'оцененном', 'оцененному', 'оцененной', 'оценен',
           'оценено', 'оценена', 'оценены',)
