Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Быстрая замена в тексте латинских символов на кириллические со сходным начертанием

#регулярные_выражения #sublime_text #sublime_text_3


Здравствуйте. Приходится иметь дело с русскими текстами, где присутствует нежелательное
вкрапление символов английского алфавита. 



Т. к. расположение вкраплений всегда разное и не подчинено каким-либо правилам, я
не могу осуществлять поиск слов в тексте.

Решение — заменить латинские буквы ABEKMHOPCTXaeopcyx на соответствующие им кириллические
АВЕКМНОРСТХаеорсух: A → А, B → В и т. д. Как в Sublime Text эффективнее всего произвести
все 18 замен?

Этот вопрос частный случай более общего: как произвести множество замен в одном регулярном
выражении? Спасибо.
    


Ответы

Ответ 1



Плагин для ST2, выполняющий желаемое: # -*- coding: utf-8 -*- import sublime, sublime_plugin class MultipleReplace(sublime_plugin.TextCommand): def run(self, edit): target = "ABEKMHOPCTXaeopcyx" # en replacer = u"абекмнорстхАЕОРСУХ" # ru region = sublime.Region(0, self.view.size()) fullText = unicode( self.view.substr( region ) ) count = 0 for ch in range( len(target) ): count += fullText.count( target[ch] ) fullText = fullText.replace( target[ch], replacer[ch] ) self.view.replace( edit, region, fullText ) sublime.status_message( "Hidden chars replaced: " + str( count ) ) Плагин для ST3, выполняющий желаемое: # -*- coding: utf-8 -*- import sublime, sublime_plugin class MultipleReplace(sublime_plugin.TextCommand): def run(self, edit): target = "ABEKMHOPCTXaeopcyx" # en replacer = u"абекмнорстхАЕОРСУХ" # ru region = sublime.Region(0, self.view.size()) fullText = self.view.substr( region ) count = 0 for ch in range( len(target) ): count += fullText.count( target[ch] ) fullText = fullText.replace( target[ch], replacer[ch] ) self.view.replace( edit, region, fullText ) sublime.status_message( "Hidden chars replaced: " + str( count ) ) Вечером распишу подробнее, как устанавливать плагины в ST. Здесь можно найти, как устанавливать плагин: https://habrahabr.ru/post/136529/

Ответ 2



Just for fun Все это можно сделать регулярным выражением в один проход, но рекомендую плагин все же. Плагин - это правильный путь решения задачи. Итак Добавляем в конец текста с новой строки "магическую" строку (в ней чередуются латинский символ и соответствующий киррилический) AАBВEЕKКMМHНOОPРCСTТXХaаeеoоpрcсyуxх Ищем по регулярному выражению (.)(?=[\s\S]*\n[^\n]*\1(.)(?:[^\n]{2})*\n?(?![\s\S])) с учетом регистра замену делаем на $2 удаляем "магическую" строку из текста Потрогать регулярку можно здесь: https://regex101.com/r/iW2yE3/1

Ответ 3



К сведению Нативный поиск Ctrl+F Sublime Text 3 позволяет вести множественный поиск. Синтаксис поисковых запросов: ($первая фраза|$вторая фраза). Однако сделать множественную замену одним запросом в нативном поиске не получится. Решение, расписанное в данном ответе, позволяет делать множественные замены только в одном файле, но не нескольких. Не скажу, что очень уж тщательно искал, но мне вообще не удалось найти любых программ (искал для своей ОС — Windows), при помощи которых можно было бы делать множественные замены во множестве файлов. Протестировано в ноябре 2016 на Sublime Text Build 3126. Упреждаю, поскольку, например, настройки, описанные в статье о RegReplace за июнь 2016 уже утратили актуальность. RegReplace Плагин, служащий для выполнения множественных замен в Sublime Text 3, документация. Позволяет заменять не только в простых случаях, как рассматриваемый в данном вопросе, но и с использованием регулярных выражений, для операций с которыми используется модуль Python re. Составление правил замены в RegReplace Preferences → Package Settings → RegReplace → Rules - User → в открывшийся файл вставляем код. { "replacements": { "sasha_felicity_A": { "find": "A", "replace": "А", }, "sasha_felicity_B": { "find": "B", "replace": "В", }, "sasha_felicity_E": { "find": "E", "replace": "Е", }, "sasha_felicity_K": { "find": "K", "replace": "К", }, "sasha_felicity_M": { "find": "M", "replace": "М", }, "sasha_felicity_H": { "find": "H", "replace": "Н", }, "sasha_felicity_O": { "find": "O", "replace": "О", }, "sasha_felicity_P": { "find": "P", "replace": "Р", }, "sasha_felicity_C": { "find": "C", "replace": "С", }, "sasha_felicity_T": { "find": "T", "replace": "Т", }, "sasha_felicity_a": { "find": "a", "replace": "а", }, "sasha_felicity_e": { "find": "e", "replace": "е", }, "sasha_felicity_o": { "find": "o", "replace": "о", }, "sasha_felicity_p": { "find": "p", "replace": "р", }, "sasha_felicity_c": { "find": "c", "replace": "с", }, "sasha_felicity_y": { "find": "y", "replace": "у", }, "sasha_felicity_x": { "find": "x", "replace": "х", }, } } Напротив find латинские символы, напротив replace — кириллические. Вместо sasha_felicity_$буква можете назвать правила любыми другими именами, лишь бы они не совпадали с названиями других правил. Если не указать флага IGNORECASE, то при выполнении операций поиска и замены будет учитываться регистр. Латинская H в тексте заменится на кириллическую Н, но латинская h не сменится кириллической н, что и нужно по условиям вопроса. Если учитывать регистр надо, синтаксис правила будет таким: "sasha_felicity_H": { "find": "(?i)H", "replace": "Н", }, Запуск команды с правилами RegReplace Для работы с командами в Sublime Text я использую фрэймворк Suricate. Он позволяет не создавать 100500 файлов sublimе-commands, sublime-keymap, Context.sublime-menu и Main.sublime-menu, а задать настройки для открытия команд из Command Palette, контекстного меню, Menu Bar и горячими клавишами в одном файле сразу для всех команд всех плагинов и настроек по умолчанию. Страница документации Suricate о командах, Как настроить запуск команд в Suricate. В файл User/Default.suricate-profile добавляем следующие строки: "sublime_latin_to_cyrillic": { "call": "sublime.reg_replace", "caption": "RegReplace: Latin To Cyrillic", "args": { "replacements": [ "sasha_felicity_A", "sasha_felicity_B", "sasha_felicity_E", "sasha_felicity_K", "sasha_felicity_M", "sasha_felicity_H", "sasha_felicity_O", "sasha_felicity_P", "sasha_felicity_C", "sasha_felicity_T", "sasha_felicity_a", "sasha_felicity_e", "sasha_felicity_o", "sasha_felicity_p", "sasha_felicity_c", "sasha_felicity_y", "sasha_felicity_x", ] } }, Параметры: sublime_latin_to_cyrillic — имя массива. Можете задать произвольное, лишь бы самим было понятно, что оно означает. call — название команды Sublime Text в формате sublime.$имя команды. caption — как будет называться пункт в Command Palette, нажав на который запустится команда, прописанная в call. Вместо RegReplace: Latin To Cyrillic Можете задать произвольное, лишь бы самим было понятно, что оно означает. args — аргументы команды reg_replace. В их качестве выступают правила, о которых шла речь в предыдущем разделе. я рекомендую использовать Suricate, но можете задать настройки и без установки дополнительных плагинов. Preferences → Package Settings → RegReplace → Commands - User → в открывшийся файл вставляем код: [ { "caption": "Reg Replace: Test RegReplace", "command": "reg_replace", "args": { "replacements": [ "sasha_felicity_A", "sasha_felicity_B", "sasha_felicity_E", "sasha_felicity_K", "sasha_felicity_M", "sasha_felicity_H", "sasha_felicity_O", "sasha_felicity_P", "sasha_felicity_C", "sasha_felicity_T", "sasha_felicity_a", "sasha_felicity_e", "sasha_felicity_o", "sasha_felicity_p", "sasha_felicity_c", "sasha_felicity_y", "sasha_felicity_x", ] } } ] Что означают параметры, понятно из предыдущего раздела. Не путайтесь в JSON-синтаксисе конфигурационных файлов, правильно расставляйте скобки, кавычки и запятые. Использование После того, как произвели все настройки, открываем файл, в котором необходимо произвести замену, → Ctrl+Shift+P → Suricate: RegReplace: Latin To Cyrillic → Enter → должно получиться так:

Комментариев нет:

Отправить комментарий