# -*- coding: utf-8 -*- import re import sys LATIN_TO_CYRILLIC = { "a": "а", "A": "А", "b": "б", "B": "Б", "d": "д", "D": "Д", "e": "е", "E": "Е", "f": "ф", "F": "Ф", "g": "г", "G": "Г", "h": "ҳ", "H": "Ҳ", "i": "и", "I": "И", "j": "ж", "J": "Ж", "k": "к", "K": "К", "l": "л", "L": "Л", "m": "м", "M": "М", "n": "н", "N": "Н", "o": "о", "O": "О", "p": "п", "P": "П", "q": "қ", "Q": "Қ", "r": "р", "R": "Р", "s": "с", "S": "С", "t": "т", "T": "Т", "u": "у", "U": "У", "v": "в", "V": "В", "x": "х", "X": "Х", "y": "й", "Y": "Й", "z": "з", "Z": "З", "ʼ": "ъ", # TODO: case? } LATIN_VOWELS = ("a", "A", "e", "E", "i", "I", "o", "O", "u", "U", "o‘", "O‘") # These words cannot be reliably converted to cyrillic because of the lossy # nature of the to_latin converter. TS_WORDS = { "aberra(ts)ion": "аберрацион", "aberra(ts)iya": "аберрация", "abza(ts)": "абзац", "aboli(ts)iya": "аболиция", "absorb(s)iya": "абсорбция", "abstrak(s)ionizm": "абстракционизм", "abstrak(s)ionist": "абстракционист", "abstrak(s)iya": "абстракция", "abs(s)ess": "абсцесс", "avianose(ts)": "авианосец", "avia(ts)iya": "авиация", "avtoinspek(s)iya": "автоинспекция", "avtopr(s)ep": "автопрцеп", "avtostan(s)iya": "автостанция", "agglyutina(ts)iya": "агглютинация", "agita(ts)ion": "агитацион", "agita(ts)iya": "агитация", "aglomera(ts)iya": "агломерация", "agnosti(ts)izm": "агностицизм", "agromeliora(ts)iya": "агромелиорация", "adapta(ts)iya": "адаптация", "administra(ts)iya": "администрация", "adsorb(s)iya": "адсорбция", "aka(ts)iya": "акация", "akklimatiza(ts)iya": "акклиматизация", "akkomoda(ts)iya": "аккомодация", "akkredita(ts)iya": "аккредитация", "ak(s)ent": "акцент", "ak(s)iz": "акциз", "ak(s)ioner": "акционер", "ak(s)ionerlik": "акционерлик", "ak(s)iya": "акция", "ak(s)iyadorlik": "акциядорлик", "allitera(ts)iya": "аллитерация", "amortiza(ts)iya": "амортизация", "amputa(ts)iya": "ампутация", "annota(ts)iya": "аннотация", "annulya(ts)iya": "аннуляция", "anti(ts)iklon": "антициклон", "antra(ts)it": "антрацит", "apellya(ts)iya": "апелляция", "appendi(ts)it": "аппендицит", "applika(ts)iya": "аппликация", "aproba(ts)iya": "апробация", "argumenta(ts)iya": "аргументация", "assimilya(ts)iya": "ассимиляция", "asso(ts)ia(ts)iya": "ассоциация", "attesta(ts)ion": "аттестацион", "attesta(ts)iya": "аттестация", "attrak(s)ion": "аттракцион", "auk(s)ion": "аукцион", "a(ts)etilen": "ацетилен", "a(ts)eton": "ацетон", "aeronaviga(ts)iya": "аэронавигация", "bakteri(ts)id": "бактерицид", "ba(ts)illar": "бациллар", "bioloka(ts)iya": "биолокация", "biolyumines(s)en(s)iya": "биолюминесценция", "bo(ts)man": "боцман", "bronenose(ts)": "броненосец", "bru(ts)ellyoz": "бруцеллёз", "vak(s)ina": "вакцина", "valva(ts)iya": "вальвация", "vegeta(ts)ion": "вегетацион", "vegeta(ts)iya": "вегетация", "venepunk(s)iya": "венепункция", "ventilya(ts)ion": "вентиляцион", "ventilya(ts)iya": "вентиляция", "vibra(ts)iya": "вибрация", "vibroizolya(ts)iya": "виброизоляция", "vi(ts)e-": "вице-", "vi(ts)e-admiral": "вице-адмирал", "vi(ts)e-prezident": "вице-президент", "vulkaniza(ts)iya": "вулканизация", "galli(ts)izm": "галлицизм", "gallyu(ts)ina(ts)iya": "галлюцинация", "galvaniza(ts)iya": "гальванизация", "gastrol-kon(s)ert": "гастроль-концерт", "gaubi(ts)a": "гаубица", "gelio(ts)entrik": "гелиоцентрик", "geno(ts)id": "геноцид", "geo(ts)entrik": "геоцентрик", "gerbi(ts)idlar": "гербицидлар", "ger(s)": "герц", "ger(s)og": "герцог", "gia(ts)int": "гиацинт", "gidromeliora(ts)iya": "гидромелиорация", "gidromexaniza(ts)iya": "гидромеханизация", "gidrostan(s)iya": "гидростанция", "gidroelektrostan(s)iya": "гидроэлектростанция", "giperinflya(ts)iya": "гиперинфляция", "gipo(ts)entr": "гипоцентр", "gli(ts)erin": "глицерин", "glya(ts)iolog": "гляциолог", "glya(ts)iologiya": "гляциология", "gorchi(ts)a": "горчица", "gravita(ts)iya": "гравитация", "grada(ts)iya": "градация", "guseni(ts)a": "гусеница", "devalva(ts)iya": "девальвация", "degaza(ts)iya": "дегазация", "degenera(ts)iya": "дегенерация", "degustat(s)iya": "дегустатция", "deduk(s)iya": "дедукция", "dezaktiva(ts)iya": "дезактивация", "dezinsek(s)iya": "дезинсекция", "dezinfek(s)iya": "дезинфекция", "dezinfek(s)iyalamoq": "дезинфекцияламоқ", "deklama(ts)iya": "декламация", "deklama(ts)iyachi": "декламациячи", "deklara(ts)iya": "декларация", "dekora(ts)iya": "декорация", "delega(ts)iya": "делегация", "delimita(ts)iya": "делимитация", "demarka(ts)iya": "демаркация", "demilitariza(ts)iya": "демилитаризация", "demobiliza(ts)iya": "демобилизация", "denaturaliza(ts)iya": "денатурализация", "denomina(ts)iya": "деноминация", "denonsa(ts)iya": "денонсация", "depilya(ts)iya": "депиляция", "deporta(ts)iya": "депортация", "deratiza(ts)iya": "дератизация", "deriva(ts)ion": "деривацион", "deriva(ts)iya": "деривация", "desika(ts)iya": "десикация", "detona(ts)iya": "детонация", "defini(ts)iya": "дефиниция", "defi(ts)it": "дефицит", "deflya(ts)iya": "дефляция", "defolia(ts)iya": "дефолиация", "deforma(ts)iya": "деформация", "de(ts)igramm": "дециграмм", "de(ts)ilitr": "децилитр", "de(ts)imetr": "дециметр", "dik(s)iya": "дикция", "direk(s)iya": "дирекция", "diskvalifika(ts)iya": "дисквалификация", "diskrimina(ts)iya": "дискриминация", "disloka(ts)iya": "дислокация", "dispropor(s)iya": "диспропорция", "disserta(ts)iya": "диссертация", "dissimilya(ts)iya": "диссимиляция", "disso(ts)ia(ts)iya": "диссоциация", "distan(s)ion": "дистанцион", "distan(s)iya": "дистанция", "distillya(ts)iya": "дистилляция", "differen(s)ial": "дифференциал", "differen(s)ia(ts)iya": "дифференциация", "differen(s)iyalamoq": "дифференцияламоқ", "dota(ts)iya": "дотация", "do(ts)ent": "доцент", "jinoiy-pro(ts)essual": "жиноий-процессуал", "identifika(ts)iya": "идентификация", "izolya(ts)ion": "изоляцион", "izolya(ts)iya": "изоляция", "izolya(ts)iyalamoq": "изоляцияламоқ", "illyumina(ts)iya": "иллюминация", "illyustra(ts)iya": "иллюстрация", "immigra(ts)iya": "иммиграция", "immobiliza(ts)iya": "иммобилизация", "impoten(s)iya": "импотенция", "improviza(ts)iya": "импровизация", "inaugura(ts)iya": "инаугурация", "inventariza(ts)iya": "инвентаризация", "investi(ts)iya": "инвестиция", "ingalya(ts)iya": "ингаляция", "indeksa(ts)iya": "индексация", "induk(s)ion": "индукцион", "induk(s)iya": "индукция", "iner(s)iya": "инерция", "iner(s)iyali": "инерцияли", "inkvizi(ts)iya": "инквизиция", "inkorpora(ts)iya": "инкорпорация", "inkuba(ts)iya": "инкубация", "innova(ts)iya": "инновация", "inspek(s)iya": "инспекция", "instar(s)iya": "инстарция", "instruk(s)iya": "инструкция", "ins(s)enirovka": "инсценировка", "integra(ts)iya": "интеграция", "intelligen(s)iya": "интеллигенция", "interven(s)iya": "интервенция", "interven(s)iyachi": "интервенциячи", "interna(ts)ional": "интернационал", "interna(ts)ionalizm": "интернационализм", "interna(ts)ionalist": "интернационалист", "intoksika(ts)iya": "интоксикация", "intona(ts)ion": "интонацион", "intona(ts)iya": "интонация", "intui(ts)iya": "интуиция", "infek(s)ion": "инфекцион", "infek(s)iya": "инфекция", "inflya(ts)iya": "инфляция", "informa(ts)ion": "информацион", "informa(ts)iya": "информация", "inʼek(s)iya": "инъекция", "irra(ts)ional": "иррационал", "irriga(ts)ion": "ирригацион", "irriga(ts)iya": "ирригация", "kalkulya(ts)iya": "калькуляция", "kal(s)iy": "кальций", "kanaliza(ts)iya": "канализация", "kan(s)eliyariya": "канцелиярия", "kan(s)erogen": "канцероген", "kan(s)ler": "канцлер", "kapitaliza(ts)iya": "капитализация", "kapitulya(ts)iya": "капитуляция", "kassa(ts)iya": "кассация", "katol(s)izm": "католцизм", "kvalifika(ts)iya": "квалификация", "kvar(s)": "кварц", "kvar(s)it": "кварцит", "kvitan(s)iya": "квитанция", "kinokon(s)ert": "киноконцерт", "kinos(s)enariy": "киносценарий", "klassifika(ts)iya": "классификация", "klassi(ts)izm": "классицизм", "koali(ts)ion": "коалицион", "koali(ts)iya": "коалиция", "kodifika(ts)iya": "кодификация", "kollek(s)ioner": "коллекционер", "kollek(s)iya": "коллекция", "kollek(s)iyachchi": "коллекцияччи", "kolon(s)ifra": "колонцифра", "kombina(ts)iya": "комбинация", "kommer(s)iya": "коммерция", "kommunika(ts)iya": "коммуникация", "kommuta(ts)iya": "коммутация", "kompensa(ts)iya": "компенсация", "kompeten(s)iya": "компетенция", "kompilya(ts)iya": "компиляция", "kompozi(ts)ion": "композицион", "kompozi(ts)iya": "композиция", "konvek(s)iya": "конвекция", "konven(s)iya": "конвенция", "konverta(ts)iya": "конвертация", "kondensa(ts)iya": "конденсация", "kondi(ts)iya": "кондиция", "kondi(ts)ioner": "кондиционер", "konkuren(s)iya": "конкуренция", "konserva(ts)iya": "консервация", "konsigna(ts)iya": "консигнация", "konsolida(ts)iya": "консолидация", "konsor(s)ium": "консорциум", "konspira(ts)iya": "конспирация", "konstitu(ts)ion": "конституцион", "konstitu(ts)iya": "конституция", "konstitu(ts)iyaviy": "конституциявий", "konstruk(s)iya": "конструкция", "konsulta(ts)iya": "консультация", "kontrakta(ts)iya": "контрактация", "kontribu(ts)iya": "контрибуция", "kontrrevolyu(ts)ion": "контрреволюцион", "kontrrevolyu(ts)ioner": "контрреволюционер", "kontrrevolyu(ts)iya": "контрреволюция", "konfedera(ts)iya": "конфедерация", "konferen(s)-zal": "конференц-зал", "konferen(s)iya": "конференция", "konfiska(ts)iya": "конфискация", "konfronta(ts)iya": "конфронтация", "konfu(ts)iylik": "конфуцийлик", "konfu(ts)iychilik": "конфуцийчилик", "kon(s)entrat": "концентрат", "kon(s)entratli": "концентратли", "kon(s)entra(ts)ion": "концентрацион", "kon(s)entra(ts)iya": "концентрация", "kon(s)entra(ts)iyalashmoq": "концентрациялашмоқ", "kon(s)entrik": "концентрик", "kon(s)ep(s)iya": "концепция", "kon(s)ern": "концерн", "kon(s)ert": "концерт", "kon(s)ertmeyster": "концертмейстер", "kon(s)essiya": "концессия", "kon(s)lager": "концлагерь", "koopera(ts)iya": "кооперация", "koopta(ts)iya": "кооптация", "koordina(ts)ion": "координацион", "koordina(ts)iya": "координация", "korpora(ts)iya": "корпорация", "korrelya(ts)iya": "корреляция", "korresponden(s)iya": "корреспонденция", "korrup(s)iya": "коррупция", "koeffi(ts)iyent": "коэффициент", "krema(ts)iya": "кремация", "kristalliza(ts)iya": "кристаллизация", "kulmina(ts)ion": "кульминацион", "kulmina(ts)iya": "кульминация", "kultiva(ts)iya": "культивация", "lakta(ts)iya": "лактация", "lamina(ts)iya": "ламинация", "lan(s)et": "ланцет", "levomi(ts)etin": "левомицетин", "legitima(ts)iya": "легитимация", "leyko(ts)itlar": "лейкоцитлар", "leyko(ts)itoz": "лейкоцитоз", "lek(s)iya": "лекция", "liberaliza(ts)iya": "либерализация", "li(ts)ey": "лицей", "li(ts)enziya": "лицензия", "lokaliza(ts)iya": "локализация", "loka(ts)iya": "локация", "lo(ts)man": "лоцман", "lyumenis(s)en(s)iya": "люменисценция", "lyute(ts)iy": "лютеций", "manipulya(ts)iya": "манипуляция", "margane(ts)": "марганец", "matri(ts)a": "матрица", "medi(ts)ina": "медицина", "meliora(ts)iya": "мелиорация", "menstrua(ts)iya": "менструация", "metalliza(ts)iya": "металлизация", "metiza(ts)iya": "метизация", "mexaniza(ts)iya": "механизация", "mexaniza(ts)iyalash": "механизациялаш", "mexaniza(ts)iyalashmoq": "механизациялашмоқ", "mexani(ts)izm": "механицизм", "migra(ts)iya": "миграция", "mizans(s)ena": "мизансцена", "militariza(ts)iya": "милитаризация", "mili(ts)ioner": "милиционер", "mili(ts)iya": "милиция", "mili(ts)iyaxona": "милицияхона", "mineraliza(ts)iya": "минерализация", "minonose(ts)": "миноносец", "misti(ts)izm": "мистицизм", "mobiliza(ts)iya": "мобилизация", "moderniza(ts)iya": "модернизация", "moderniza(ts)iyalamoq": "модернизацияламоқ", "modifika(ts)iya": "модификация", "moto(ts)ikl": "мотоцикл", "moto(ts)iklet": "мотоциклет", "moto(ts)ikletchi": "мотоциклетчи", "moto(ts)iklli": "мотоциклли", "moto(ts)iklchi": "мотоциклчи", "multiplika(ts)ion": "мультипликацион", "multiplika(ts)iya": "мультипликация", "muni(ts)ipaliza(ts)iya": "муниципализация", "muni(ts)ipalitet": "муниципалитет", "naviga(ts)iya": "навигация", "naturaliza(ts)iya": "натурализация", "na(ts)ionaliza(ts)iya": "национализация", "nene(ts)": "ненец", "nene(ts)lar": "ненецлар", "nitrogli(ts)erin": "нитроглицерин", "nomina(ts)iya": "номинация", "nostrifika(ts)iya": "нострификация", "nullifika(ts)iya": "нуллификация", "obliga(ts)iya": "облигация", "obroga(ts)iya": "оброгация", "observa(ts)iya": "обсервация", "okkupa(ts)ion": "оккупацион", "okkupa(ts)iya": "оккупация", "okkupa(ts)iyachi": "оккупациячи", "opera(ts)iya": "операция", "opera(ts)iyaviy": "операциявий", "oppozo(ts)ion": "оппозоцион", "oppozi(ts)iya": "оппозиция", "oppozi(ts)iyachi": "оппозициячи", "op(s)ion": "опцион", "ordinare(ts)": "ординарец", "oriyenta(ts)iya": "ориентация", "osteomalya(ts)iya": "остеомаляция", "ofi(ts)er": "офицер", "ofi(ts)iant": "официант", "ofi(ts)iantka": "официантка", "palpa(ts)iya": "пальпация", "pa(ts)iyent": "пациент", "pa(ts)ifizm": "пацифизм", "pa(ts)ifist": "пацифист", "peni(ts)(s)ilin": "пениццилин", "pesti(ts)idlar": "пестицидлар", "peti(ts)iya": "петиция", "petli(ts)a": "петлица", "pigmenta(ts)iya": "пигментация", "pin(s)et": "пинцет", "pi(ts)(s)a": "пицца", "planta(ts)iya": "плантация", "pla(ts)darm": "плацдарм", "pla(ts)kart": "плацкарт", "pla(ts)karta": "плацкарта", "pla(ts)kartali": "плацкартали", "plebis(s)it": "плебисцит", "podstan(s)iya": "подстанция", "pozi(ts)ion": "позицион", "pozi(ts)iya": "позиция", "poli(ts)iya": "полиция", "poli(ts)iyachi": "полициячи", "poli(ts)meyster": "полицмейстер", "pollyu(ts)iya": "поллюция", "populya(ts)iya": "популяция", "por(s)iya": "порция", "poten(s)ial": "потенциал", "prezenta(ts)iya": "презентация", "press-konferen(s)iya": "пресс-конференция", "preferen(s)iya": "преференция", "privatiza(ts)iya": "приватизация", "prin(s)ip": "принцип", "prin(s)ipial": "принципиал", "prin(s)ipiallik": "принципиаллик", "prin(s)ipli": "принципли", "prin(s)ipsiz": "принципсиз", "pri(ts)ep": "прицеп", "provin(s)ializm": "провинциализм", "provin(s)iya": "провинция", "provoka(ts)iya": "провокация", "proyek(s)iya": "проекция", "proyek(s)iyalamoq": "проекцияламоқ", "proklama(ts)iya": "прокламация", "prolonga(ts)iya": "пролонгация", "propor(s)ional": "пропорционал", "propor(s)ionallik": "пропорционаллик", "propor(s)iya": "пропорция", "protek(s)ionizm": "протекционизм", "pro(ts)ent": "процент", "pro(ts)entli": "процентли", "pro(ts)entchi": "процентчи", "pro(ts)ess": "процесс", "pro(ts)essor": "процессор", "pro(ts)essual": "процессуал", "publi(ts)ist": "публицист", "publi(ts)istik": "публицистик", "publi(ts)istika": "публицистика", "punktua(ts)ion": "пунктуацион", "punktua(ts)iya": "пунктуация", "punk(s)iya": "пункция", "radia(ts)ion": "радиацион", "radia(ts)iya": "радиация", "radioloka(ts)iya": "радиолокация", "radionaviga(ts)iya": "радионавигация", "radiostan(s)iya": "радиостанция", "rane(ts)": "ранец", "ratifika(ts)iya": "ратификация", "rafina(ts)iya": "рафинация", "rafina(ts)iyalash": "рафинациялаш", "ra(ts)ion": "рацион", "ra(ts)ional": "рационал", "ra(ts)ionalizator": "рационализатор", "ra(ts)ionalizatorlik": "рационализаторлик", "ra(ts)ionaliza(ts)iya": "рационализация", "ra(ts)ionalizm": "рационализм", "ra(ts)ionalist": "рационалист", "ra(ts)ionlallashmoq": "рационлаллашмоқ", "ra(ts)iya": "рация", "reabilita(ts)iya": "реабилитация", "reak(s)ion": "реакцион", "reak(s)ioner": "реакционер", "reak(s)iya": "реакция", "reak(s)iyachi": "реакциячи", "realiza(ts)iya": "реализация", "reanima(ts)iya": "реанимация", "revalva(ts)iya": "ревальвация", "revolyu(ts)ion": "революцион", "revolyu(ts)ioner": "революционер", "revolyu(ts)iya": "революция", "regenera(ts)iya": "регенерация", "registra(ts)iya": "регистрация", "redak(s)ion": "редакцион", "redak(s)iya": "редакция", "reduk(s)iya": "редукция", "reduplika(ts)iya": "редупликация", "rezek(s)iya": "резекция", "reziden(s)iya": "резиденция", "rezolyu(ts)iya": "резолюция", "reinvesti(ts)iya": "реинвестиция", "rekvizi(ts)iya": "реквизиция", "reklama(ts)iya": "рекламация", "rekognos(s)irovka": "рекогносцировка", "rekomenda(ts)iya": "рекомендация", "rekonstruk(s)iya": "реконструкция", "rekonstruk(s)iyalamoq": "реконструкцияламоқ", "remilitariza(ts)iya": "ремилитаризация", "repara(ts)iya": "репарация", "repatri(ts)iya": "репатриция", "repeti(ts)iya": "репетиция", "reprivatiza(ts)iya": "реприватизация", "reproduk(s)iya": "репродукция", "restavra(ts)iya": "реставрация", "retranslya(ts)iya": "ретрансляция", "reforma(ts)iya": "реформация", "refrak(s)iya": "рефракция", "re(ts)enzent": "рецензент", "re(ts)enziya": "рецензия", "re(ts)ept": "рецепт", "re(ts)eptorlar": "рецепторлар", "re(ts)idiv": "рецидив", "re(ts)idivist": "рецидивист", "re(ts)ipiyent": "реципиент", "reevakua(ts)iya": "реэвакуация", "reemigra(ts)iya": "реэмиграция", "ri(ts)arlik": "рицарлик", "ri(ts)ar": "рицарь", "rota(ts)ion": "ротацион", "sana(ts)iya": "санация", "sana(ts)iyalash": "санациялаш", "sank(s)iya": "санкция", "sekre(ts)iya": "секреция", "sek(s)iya": "секция", "selek(s)ion": "селекцион", "selek(s)iya": "селекция", "selek(s)iyachi": "селекциячи", "selek(s)iyachilik": "селекциячилик", "sensa(ts)ion": "сенсацион", "sensa(ts)iya": "сенсация", "signaliza(ts)iya": "сигнализация", "sili(ts)iy": "силиций", "situa(ts)iya": "ситуация", "skepti(ts)izm": "скептицизм", "slane(ts)": "сланец", "so(ts)ial": "социал", "so(ts)ial-demokrat": "социал-демократ", "so(ts)ial-demokratik": "социал-демократик", "so(ts)ial-demokratiya": "социал-демократия", "so(ts)ializa(ts)iya": "социализация", "so(ts)ializm": "социализм", "so(ts)ialist": "социалист", "so(ts)ialistik": "социалистик", "so(ts)iolingvistika": "социолингвистика", "so(ts)iolog": "социолог", "so(ts)iologik": "социологик", "so(ts)iologiya": "социология", "spekulya(ts)iya": "спекуляция", "spe(ts)ifik": "специфик", "spe(ts)ifika": "специфика", "spe(ts)ifika(ts)iya": "спецификация", "stabiliza(ts)iya": "стабилизация", "stan(s)iya": "станция", "sta(ts)ionar": "стационар", "steriliza(ts)iya": "стерилизация", "stoi(ts)izm": "стоицизм", "stron(s)iy": "стронций", "substan(s)iya": "субстанция", "s(s)enariy": "сценарий", "s(s)enariychi": "сценарийчи", "s(s)enarist": "сценарист", "tabli(ts)a": "таблица", "tan(s)a": "танца", "teleins(s)enirovka": "телеинсценировка", "telekommunika(ts)iya": "телекоммуникация", "telemexaniza(ts)iya": "телемеханизация", "tenden(s)ioz": "тенденциоз", "tenden(s)iozlik": "тенденциозлик", "tenden(s)iya": "тенденция", "tepli(ts)a": "теплица", "teploizolya(ts)iya": "теплоизоляция", "termoizolya(ts)iya": "термоизоляция", "ter(s)et": "терцет", "ter(s)iya": "терция", "texne(ts)iy": "технеций", "tradi(ts)ion": "традицион", "tradi(ts)iya": "традиция", "transkrip(s)ion": "транскрипцион", "transkrip(s)iya": "транскрипция", "transkrip(s)iyalamoq": "транскрипцияламоқ", "translitera(ts)iya": "транслитерация", "translya(ts)ion": "трансляцион", "translya(ts)iya": "трансляция", "transplanta(ts)iya": "трансплантация", "transforma(ts)iya": "трансформация", "transforma(ts)iyalamoq": "трансформацияламоқ", "trape(ts)iya": "трапеция", "trepana(ts)iya": "трепанация", "uborshi(ts)a": "уборшица", "uzurpa(ts)iya": "узурпация", "unifika(ts)iya": "унификация", "unifika(ts)iyalashtirmoq": "унификациялаштирмоқ", "unter-ofi(ts)er": "унтер-офицер", "urbaniza(ts)iya": "урбанизация", "fago(ts)it": "фагоцит", "falsifika(ts)iya": "фальсификация", "farma(ts)evt": "фармацевт", "farma(ts)evtika": "фармацевтика", "farma(ts)iya": "фармация", "federa(ts)iya": "федерация", "fermenta(ts)iya": "ферментация", "film-kon(s)ert": "фильм-концерт", "filtra(ts)iya": "фильтрация", "fiton(s)id": "фитонцид", "forma(ts)iya": "формация", "frak(s)ion": "фракцион", "frak(s)iooner": "фракциоонер", "frak(s)iya": "фракция", "fran(s)iya": "франция", "fran(s)uz": "француз", "fran(s)uzlar": "французлар", "fran(s)uzcha": "французча", "fri(ts)": "фриц", "funk(s)ional": "функционал", "funk(s)iya": "функция", "xemosorb(s)iya": "хемосорбция", "xole(ts)istit": "холецистит", "(s)anga": "цанга", "(s)apfa": "цапфа", "(s)edra": "цедра", "(s)eziy": "цезий", "(s)eytnot": "цейтнот", "(s)ellofan": "целлофан", "(s)elluloid": "целлулоид", "(s)ellyuloza": "целлюлоза", "(s)elsiy": "цельсий", "(s)ement": "цемент", "(s)ementlamoq": "цементламоқ", "(s)enz": "ценз", "(s)enzor": "цензор", "(s)enzura": "цензура", "(s)ent": "цент", "(s)entner": "центнер", "(s)entnerli": "центнерли", "(s)entnerchi": "центнерчи", "(s)entralizm": "централизм", "(s)entrizm": "центризм", "(s)entrist": "центрист", "(s)entrifuga": "центрифуга", "(s)eriy": "церий", "(s)esarka": "цесарка", "(s)ex": "цех", "(s)ian": "циан", "(s)ianli": "цианли", "(s)iviliza(ts)iya": "цивилизация", "(s)igara": "цигара", "(s)ikl": "цикл", "(s)iklik": "циклик", "(s)ikllashtirmoq": "цикллаштирмоқ", "(s)iklli": "циклли", "(s)iklon": "циклон", "(s)iklotron": "циклотрон", "(s)ilindr": "цилиндр", "(s)ilindrik": "цилиндрик", "(s)ilindrli": "цилиндрли", "(s)inga": "цинга", "(s)ink": "цинк", "(s)inkograf": "цинкограф", "(s)inkografiya": "цинкография", "(s)irk": "цирк", "(s)irkoniy": "цирконий", "(s)irkul": "циркуль", "(s)irkulyar": "циркуляр", "(s)irkchi": "циркчи", "(s)irroz": "цирроз", "(s)isterna": "цистерна", "(s)isternali": "цистернали", "(s)istit": "цистит", "(s)itata": "цитата", "(s)itatabozlik": "цитатабозлик", "(s)ito-": "цито-", "(s)itodiagnostika": "цитодиагностика", "(s)itokimyo": "цитокимё", "(s)itoliz": "цитолиз", "(s)itologiya": "цитология", "(s)itrus": "цитрус", "(s)iferblat": "циферблат", "(s)iferblatli": "циферблатли", "(s)okol": "цоколь", "(s)unami": "цунами", "cherepi(ts)a": "черепица", "shvey(s)ar": "швейцар", "shmu(ts)titul": "шмуцтитул", "shni(ts)el": "шницель", "shpri(ts)": "шприц", "shtangen(s)irkul": "штангенциркуль", "evakua(ts)iya": "эвакуация", "evolyu(ts)ion": "эволюцион", "evolyu(ts)iya": "эволюция", "ego(ts)entrizm": "эгоцентризм", "eksguma(ts)iya": "эксгумация", "ekspedi(ts)ion": "экспедицион", "ekspedi(ts)iya": "экспедиция", "ekspedi(ts)iyachi": "экспедициячи", "ekspluata(ts)iya": "эксплуатация", "ekspluata(ts)iyachi": "эксплуатациячи", "ekspozi(ts)iya": "экспозиция", "ekspropria(ts)iya": "экспроприация", "ekstradi(ts)iya": "экстрадиция", "ekstrak(s)iya": "экстракция", "elektrifika(ts)iya": "электрификация", "elektrostan(s)iya": "электростанция", "emansipa(ts)iya": "эмансипация", "emigra(ts)iya": "эмиграция", "emo(ts)ional": "эмоционал", "emo(ts)ionallik": "эмоционаллик", "emo(ts)iya": "эмоция", "empiriokriti(ts)izm": "эмпириокритицизм", "en(s)efalit": "энцефалит", "en(s)efalogramma": "энцефалограмма", "en(s)iklopedik": "энциклопедик", "en(s)iklopedist": "энциклопедист", "en(s)iklopediya": "энциклопедия", "en(s)iklopediyachi": "энциклопедиячи", "epi(ts)entr": "эпицентр", "eritro(ts)itlar": "эритроцитлар", "erudi(ts)iya": "эрудиция", "eskala(ts)iya": "эскалация", "esmine(ts)": "эсминец", "essen(s)iya": "эссенция", "yurisdik(s)iya": "юрисдикция", "yurispruden(s)iya": "юриспруденция", "yusti(ts)iya": "юстиция", } # These words cannot be reliably transliterated into cyrillic E_WORDS = { "bel(e)taj": "бельэтаж", "bugun-(e)rta": "бугун-эрта", "diqqat-(e)ʼtibor": "диққат-эътибор", "ich-(e)t": "ич-эт", "karat(e)": "каратэ", "m(e)r": "мэр", "obroʻ-(e)ʼtiborli": "обрў-эътиборли", "omon-(e)son": "омон-эсон", "r(e)ket": "рэкет", "sut(e)mizuvchilar": "сутэмизувчилар", "upa-(e)lik": "упа-элик", "xayr-(e)hson": "хайр-эҳсон", "qayn(e)gachi": "қайнэгачи", } # Not to confuse with ш SH_WORDS = {"a(sh)ob": "асҳоб", "mu(sh)af": "мусҳаф"} # Not to confuse with ё YO_WORDS = { "general-ma(yo)r": "генерал-майор", "(yo)g": "йог", "(yo)ga": "йога", "(yo)gurt": "йогурт", "(yo)d": "йод", "(yo)dlamoq": "йодламоқ", "(yo)dli": "йодли", "ma(yo)nez": "майонез", "mikrorayon": "микрорайон", "ma(yo)r": "майор", "ra(yo)n": "район", } YU_WORDS = {"mo(yu)pa": "мойупа", "po(yu)stun": "пойустун"} YA_WORDS = { "po(ya)bzal": "пойабзал", "po(ya)ndoz": "пойандоз", "po(ya)fzal": "пойафзал", } YE_WORDS = { "i(ye)": "ийе", "konve(ye)r": "конвейер", "ple(ye)r": "плейер", "sta(ye)r": "стайер", "fo(ye)": "фойе", } SOFT_SIGN_WORDS = { "aviamodel": "авиамодель", "avtomagistralavtomat": "автомагистральавтомат", "avtomobil": "автомобиль", "akvarel": "акварель", "alkogol": "алкоголь", "albatros": "альбатрос", "albom": "альбом", "alpinizm": "альпинизм", "alpinist": "альпинист", "alt": "альт", "alternativ": "альтернатив", "alternativa": "альтернатива", "altimetr": "альтиметр", "altchi": "альтчи", "alfa": "альфа", "alfa-zarralar": "альфа-зарралар", "alma-terapiya": "альма-терапия", "alyans": "альянс", "amalgama": "амальгама", "ansambl": "ансамбль", "apelsin": "апельсин", "aprel": "апрель", "artel": "артель", "artikl": "артикль", "arergard": "арьергард", "asfalt": "асфальт", "asfaltlamoq": "асфальтламоқ", "asfaltli": "асфальтли", "atele": "ателье", "bazalt": "базальт", "balzam": "бальзам", "balzamlash": "бальзамлаш", "balneolog": "бальнеолог", "balneologik": "бальнеологик", "balneologiya": "бальнеология", "balneoterapiya": "бальнеотерапия", "balneotexnika": "бальнеотехника", "banderol": "бандероль", "barelef": "барельеф", "barrel": "баррель", "barer": "барьер", "batalon": "батальон", "belveder": "бельведер", "belgiyalik": "бельгиялик", "belting": "бельтинг", "beletaj": "бельэтаж", "bilyard": "бильярд", "binokl": "бинокль", "biofiltr": "биофильтр", "bolonya": "болонья", "bolshevizm": "большевизм", "bolshevik": "большевик", "brakonerlik": "браконьерлик", "broneavtomobil": "бронеавтомобиль", "bron": "бронь", "budilnik": "будильник", "bulvar": "бульвар", "buldenej": "бульденеж", "buldog": "бульдог", "buldozer": "бульдозер", "buldozerchi": "бульдозерчи", "bulon": "бульон", "byulleten": "бюллетень", "valeryanka": "валерьянка", "valvatsiya": "вальвация", "vals": "вальс", "vanil": "ваниль", "varete": "варьете", "vedomost": "ведомость", "veksel": "вексель", "ventil": "вентиль", "vermishel": "вермишель", "verner": "верньер", "verf": "верфь", "vestibyul": "вестибюль", "videofilm": "видеофильм", "viklyuchatel": "виключатель", "vinetka": "виньетка", "violonchel": "виолончель", "vklyuchatel": "включатель", "vodevil": "водевиль", "volost": "волость", "volt": "вольт", "volta": "вольта", "voltli": "вольтли", "voltmetr": "вольтметр", "volfram": "вольфрам", "vulgar": "вульгар", "vulgarizm": "вульгаризм", "vulgarlashtirmoq": "вульгарлаштирмоқ", "gavan": "гавань", "galvanizatsiya": "гальванизация", "galvanik": "гальваник", "galvanometr": "гальванометр", "gantel": "гантель", "garmon": "гармонь", "gastrol": "гастроль", "gastrol-konsert": "гастроль-концерт", "gelmint": "гельминт", "gelmintoz": "гельминтоз", "gelmintologiya": "гельминтология", "geraldika": "геральдика", "gilza": "гильза", "giposulfit": "гипосульфит", "golf": "гольф", "gorelef": "горельеф", "gorizontal": "горизонталь", "gospital": "госпиталь", "grifel": "грифель", "guash": "гуашь", "daltonizm": "дальтонизм", "dvigatel": "двигатель", "devalvatsiya": "девальвация", "dekabr": "декабрь", "delta": "дельта", "delfin": "дельфин", "delfinariy": "дельфинарий", "delfinsimonlar": "дельфинсимонлар", "detal": "деталь", "diagonal": "диагональ", "diafilm": "диафильм", "dizel": "дизель", "dizel-motor": "дизель-мотор", "dirijabl": "дирижабль", "drel": "дрель", "duel": "дуэль", "jenshen": "женьшень", "impuls": "импульс", "inventar": "инвентарь", "insult": "инсульт", "intervyu": "интервью", "interer": "интерьер", "italyan": "итальян", "italyanlar": "итальянлар", "italyancha": "итальянча", "iyul": "июль", "iyun": "июнь", "kabel": "кабель", "kalendar": "календарь", "kalka": "калька", "kalkalamoq": "калькаламоқ", "kalkulyator": "калькулятор", "kalkulyatsiya": "калькуляция", "kalsiy": "кальций", "kanifol": "канифоль", "kapelmeyster": "капельмейстер", "kapsyul": "капсюль", "karamel": "карамель", "kartel": "картель", "kartech": "картечь", "karusel": "карусель", "karer": "карьер", "kastryul": "кастрюль", "kastryulka": "кастрюлька", "katapulta": "катапульта", "kafel": "кафель", "kinofestival": "кинофестиваль", "kinofilm": "кинофильм", "kisel": "кисель", "kitel": "китель", "knyaz": "князь", "kobalt": "кобальт", "kokil": "кокиль", "kokteyl": "коктейль", "kompyuter": "компьютер", "kompyuterlashtirmoq": "компьютерлаштирмоқ", "konsultant": "консультант", "konsultativ": "консультатив", "konsultatsiya": "консультация", "kontrol": "контроль", "konferanse": "конферансье", "konslager": "концлагерь", "kon": "конь", "konki": "коньки", "konkichi": "конькичи", "konyunktiva": "коньюнктива", "konyunktivit": "коньюнктивит", "konyunktura": "коньюнктура", "konyak": "коньяк", "korol": "король", "kreml": "кремль", "krovat": "кровать", "kulminatsion": "кульминацион", "kulminatsiya": "кульминация", "kultivator": "культиватор", "kultivatsiya": "культивация", "kulturizm": "культуризм", "kurer": "курьер", "kyat": "кьят", "lager": "лагерь", "latun": "латунь", "losos": "лосось", "loson": "лосьон", "magistral": "магистраль", "marseleza": "марсельеза", "mebel": "мебель", "medal": "медаль", "medalon": "медальон", "melxior": "мельхиор", "menshevizm": "меньшевизм", "menshevik": "меньшевик", "migren": "мигрень", "mikroinsult": "микроинсульт", "mikrofilm": "микрофильм", "model": "модель", "modeler": "модельер", "molbert": "мольберт", "monastir": "монастирь", "monokultoura": "монокультоура", "motel": "мотель", "multi-": "мульти-", "multimediya": "мультимедия", "multimillioner": "мультимиллионер", "multiplikatsion": "мультипликацион", "multiplikator": "мультипликатор", "multiplikatsiya": "мультипликация", "neft": "нефть", "nikel": "никель", "nimpalto": "нимпальто", "nippel": "ниппель", "nol": "ноль", "normal": "нормаль", "noyabr": "ноябрь", "oblast": "область", "okkultizm": "оккультизм", "oktabr": "октябрь", "otel": "отель", "oftalmologiya": "офтальмология", "ochered": "очередь", "pavilon": "павильон", "palma": "пальма", "palmazor": "пальмазор", "palpatsiya": "пальпация", "palto": "пальто", "paltobop": "пальтобоп", "paltolik": "пальтолик", "panel": "панель", "parallel": "параллель", "parol": "пароль", "patrul": "патруль", "pedal": "педаль", "penalti": "пенальти", "pechat": "печать", "pechene": "печенье", "pech": "печь", "plastir": "пластирь", "povest": "повесть", "polka": "полька", "portfel": "портфель", "porshen": "поршень", "pochtalon": "почтальон", "predoxranitel": "предохранитель", "premera": "премьера", "premer-ministr": "премьер-министр", "press-pape": "пресс-папье", "press-sekretar": "пресс-секретарь", "pristan": "пристань", "profil": "профиль", "pulverizator": "пульверизатор", "pulmonologiya": "пульмонология", "pulpa": "пульпа", "pulpit": "пульпит", "puls": "пульс", "pult": "пульт", "pesa": "пьеса", "radiospektakl": "радиоспектакль", "rante": "рантье", "revalvatsiya": "ревальвация", "revolver": "револьвер", "rezba": "резьба", "rezbali": "резьбали", "relef": "рельеф", "rels": "рельс", "relsli": "рельсли", "relssiz": "рельссиз", "retush": "ретушь", "riyel": "риель", "ritsar": "рицарь", "rol": "роль", "royal": "рояль", "rubilnik": "рубильник", "rubl": "рубль", "rul": "руль", "saldo": "сальдо", "salto": "сальто", "sekretar": "секретарь", "selderey": "сельдерей", "seld": "сельдь", "sentabr": "сентябрь", "senor": "сеньор", "senora": "сеньора", "sinka": "синька", "sinkalamoq": "синькаламоқ", "siren": "сирень", "skalpel": "скальпель", "slesar": "слесарь", "sobol": "соболь", "sol": "соль", "spektakl": "спектакль", "spiral": "спираль", "statya": "статья", "stelka": "стелька", "sterjen": "стержень", "stil": "стиль", "sudya": "судья", "sudyalik": "судьялик", "sulfat": "сульфат", "sulfatlar": "сульфатлар", "tabel": "табель", "talk": "тальк", "tekstil": "текстиль", "telefilm": "телефильм", "tigel": "тигель", "tokar": "токарь", "tol": "толь", "tonnel": "тоннель", "tunnel": "туннель", "tush": "тушь", "tyulen": "тюлень", "tyul": "тюль", "ultimatum": "ультиматум", "ultra-": "ультра-", "ultrabinafsha": "ультрабинафша", "ultramikroskop": "ультрамикроскоп", "ultratovush": "ультратовуш", "ultraqisqa": "ультрақисқа", "umivalnik": "умивальник", "util": "утиль", "fakultativ": "факультатив", "fakultet": "факультет", "fakultetlalaro": "факультетлаларо", "falsifikator": "фальсификатор", "falsifikatsiya": "фальсификация", "fevral": "февраль", "feldmarshal": "фельдмаршал", "feldsher": "фельдшер", "feldʼeger": "фельдъегерь", "feleton": "фельетон", "feletonchi": "фельетончи", "festival": "фестиваль", "fizkultura": "физкультура", "fizkulturachi": "физкультурачи", "film": "фильм", "film-konsert": "фильм-концерт", "filmoskop": "фильмоскоп", "filmoteka": "фильмотека", "filtr": "фильтр", "filtratsiya": "фильтрация", "filtrlamoq": "фильтрламоқ", "filtrli": "фильтрли", "folga": "фольга", "folklor": "фольклор", "folklorist": "фольклорист", "folkloristika": "фольклористика", "folklorchi": "фольклорчи", "folklorshunos": "фольклоршунос", "folklorshunoslik": "фольклоршунослик", "fonar": "фонарь", "fortepyano": "фортепьяно", "xolodilnik": "холодильник", "xrustal": "хрусталь", "selsiy": "цельсий", "sirkul": "циркуль", "sokol": "цоколь", "chizel": "чизель", "shagren": "шагрень", "shampun": "шампунь", "sherst": "шерсть", "shinel": "шинель", "shifoner": "шифоньер", "shnitsel": "шницель", "shpatel": "шпатель", "shpilka": "шпилька", "shpindel": "шпиндель", "shtangensirkul": "штангенциркуль", "shtapel": "штапель", "shtempel": "штемпель", "emal": "эмаль", "emulsiya": "эмульсия", "endshpil": "эндшпиль", "eskadrilya": "эскадрилья", "yuan": "юань", "yuriskonsult": "юрисконсульт", "yakor": "якорь", "yanvar": "январь", } CYRILLIC_TO_LATIN = { "а": "a", "А": "A", "б": "b", "Б": "B", "в": "v", "В": "V", "г": "g", "Г": "G", "д": "d", "Д": "D", "е": "e", "Е": "E", "ё": "yo", "Ё": "Yo", "ж": "j", "Ж": "J", "з": "z", "З": "Z", "и": "i", "И": "I", "й": "y", "Й": "Y", "к": "k", "К": "K", "л": "l", "Л": "L", "м": "m", "М": "M", "н": "n", "Н": "N", "о": "o", "О": "O", "п": "p", "П": "P", "р": "r", "Р": "R", "с": "s", "С": "S", "т": "t", "Т": "T", "у": "u", "У": "U", "ф": "f", "Ф": "F", "х": "x", "Х": "X", "ц": "s", "Ц": "S", "ч": "ch", "Ч": "Ch", "ш": "sh", "Ш": "Sh", "ъ": "ʼ", "Ъ": "ʼ", "ь": "", "Ь": "", "э": "e", "Э": "E", "ю": "yu", "Ю": "Yu", "я": "ya", "Я": "Ya", "ў": "oʻ", "Ў": "Oʻ", "қ": "q", "Қ": "Q", "ғ": "gʻ", "Ғ": "Gʻ", "ҳ": "h", "Ҳ": "H", } CYRILLIC_VOWELS = ( "а", "А", "е", "Е", "ё", "Ё", "и", "И", "о", "О", "у", "У", "э", "Э", "ю", "Ю", "я", "Я", "ў", "Ў", ) def to_cyrillic(text): """Transliterate latin text to cyrillic using the following rules: 1. ye = е in the beginning of a word or after a vowel 2. e = э in the beginning of a word or after a vowel 3. ц exception words 4. э exception words """ # These compounds must be converted before other letters compounds_first = { "ch": "ч", "Ch": "Ч", "CH": "Ч", # this line must come before 's' because it has an 'h' "sh": "ш", "Sh": "Ш", "SH": "Ш", # This line must come before 'yo' because of it's apostrophe "yo‘": "йў", "Yo‘": "Йў", "YO‘": "ЙЎ", } compounds_second = { "yo": "ё", "Yo": "Ё", "YO": "Ё", # 'ts': 'ц', 'Ts': 'Ц', 'TS': 'Ц', # No need for this, see TS_WORDS "yu": "ю", "Yu": "Ю", "YU": "Ю", "ya": "я", "Ya": "Я", "YA": "Я", "ye": "е", "Ye": "Е", "YE": "Е", # different kinds of apostrophes "o‘": "ў", "O‘": "Ў", "oʻ": "ў", "Oʻ": "Ў", "g‘": "ғ", "G‘": "Ғ", "gʻ": "ғ", "Gʻ": "Ғ", } beginning_rules = { "ye": "е", "Ye": "Е", "YE": "Е", "e": "э", "E": "Э", } after_vowel_rules = { "ye": "е", "Ye": "Е", "YE": "Е", "e": "э", "E": "Э", } exception_words_rules = { "s": "ц", "S": "Ц", "ts": "ц", "Ts": "Ц", "TS": "Ц", # but not tS "e": "э", "E": "э", "sh": "сҳ", "Sh": "Сҳ", "SH": "СҲ", "yo": "йо", "Yo": "Йо", "YO": "ЙО", "yu": "йу", "Yu": "Йу", "YU": "ЙУ", "ya": "йа", "Ya": "Йа", "YA": "ЙА", } # standardize some characters # the first one is the windows string, the second one is the mac string text = text.replace("ʻ", "‘") def replace_soft_sign_words(m): word = m.group(1) if word.isupper(): result = SOFT_SIGN_WORDS[word.lower()].upper() elif word[0].isupper(): result = SOFT_SIGN_WORDS[word.lower()] result = result[0].upper() + result[1:] else: result = SOFT_SIGN_WORDS[word.lower()] return result for word in SOFT_SIGN_WORDS: text = re.sub(r"\b(%s)" % word, replace_soft_sign_words, text, flags=re.U) def replace_exception_words(m): """Replace ц (or э) only leaving other characters unchanged""" return "%s%s%s" % ( m.group(1)[: m.start(2)], exception_words_rules[m.group(2)], m.group(1)[m.end(2) :], ) # loop because of python's limit of 100 named groups for word in list(TS_WORDS.keys()) + list(E_WORDS.keys()): text = re.sub(r"\b(%s)" % word, replace_exception_words, text, flags=re.U) # compounds text = re.sub( r"(%s)" % "|".join(compounds_first.keys()), lambda x: compounds_first[x.group(1)], text, flags=re.U, ) text = re.sub( r"(%s)" % "|".join(compounds_second.keys()), lambda x: compounds_second[x.group(1)], text, flags=re.U, ) text = re.sub( r"\b(%s)" % "|".join(beginning_rules.keys()), lambda x: beginning_rules[x.group(1)], text, flags=re.U, ) text = re.sub( r"(%s)(%s)" % ("|".join(LATIN_VOWELS), "|".join(after_vowel_rules.keys())), lambda x: "%s%s" % (x.group(1), after_vowel_rules[x.group(2)]), text, flags=re.U, ) text = re.sub( r"(%s)" % "|".join(LATIN_TO_CYRILLIC.keys()), lambda x: LATIN_TO_CYRILLIC[x.group(1)], text, flags=re.U, ) return text def to_latin(text): """Transliterate cyrillic text to latin using the following rules: 1. ц = s at the beginning of a word. ц = ts in the middle of a word after a vowel. ц = s in the middle of a word after consonant (DEFAULT in CYRILLIC_TO_LATIN) цирк = sirk цех = sex федерация = federatsiya функция = funksiya 2. е = ye at the beginning of a word or after a vowel. е = e in the middle of a word after a consonant (DEFAULT). 3. Сентябр = Sentabr, Октябр = Oktabr """ beginning_rules = {"ц": "s", "Ц": "S", "е": "ye", "Е": "Ye"} after_vowel_rules = {"ц": "ts", "Ц": "Ts", "е": "ye", "Е": "Ye"} text = re.sub( r"(сент|окт)([яЯ])(бр)", lambda x: "%s%s%s" % (x.group(1), "a" if x.group(2) == "я" else "A", x.group(3)), text, flags=re.IGNORECASE | re.U, ) text = re.sub( r"\b(%s)" % "|".join(beginning_rules.keys()), lambda x: beginning_rules[x.group(1)], text, flags=re.U, ) text = re.sub( r"(%s)(%s)" % ("|".join(CYRILLIC_VOWELS), "|".join(after_vowel_rules.keys())), lambda x: "%s%s" % (x.group(1), after_vowel_rules[x.group(2)]), text, flags=re.U, ) text = re.sub( r"(%s)" % "|".join(CYRILLIC_TO_LATIN.keys()), lambda x: CYRILLIC_TO_LATIN[x.group(1)], text, flags=re.U, ) return text def transliterate(text, to_variant): if to_variant == "cyrillic": text = to_cyrillic(text) elif to_variant == "latin": text = to_latin(text) return text if __name__ == "__main__": """cat input_in_lat.txt | python transliterate.py > output_in_cyr.txt""" for line in sys.stdin: sys.stdout.write(transliterate(line, "cyrillic"))