calibre - en to ru translation catalogue (50 entries)

en: All about using regular expressions in calibre
ru: Всё об использования регулярных выражений в calibre

en: Regular expressions are features used in many places in calibre to perform sophisticated manipulation of e-book content and metadata. This tutorial is a gentle introduction to getting you started with using regular expressions in calibre.
ru: Регулярные выражения - это функции, используемые во многих местах в calibre для выполнения сложных манипуляций с содержимым электронной книги и метаданными. Этот учебник представляет собой краткое введение в использование регулярных выражений calibre.

en: Contents
ru: Содержание

en: First, a word of warning and a word of courage
ru: Во-первых, слово предупреждения и слово мужества

en: This is, inevitably, going to be somewhat technical- after all, regular expressions are a technical tool for doing technical stuff. I'm going to have to use some jargon and concepts that may seem complicated or convoluted. I'm going to try to explain those concepts as clearly as I can, but really can't do without using them at all. That being said, don't be discouraged by any jargon, as I've tried to explain everything new. And while regular expressions themselves may seem like an arcane, black magic (or, to be more prosaic, a random string of mumbo-jumbo letters and signs), I promise that they are not all that complicated. Even those who understand regular expressions really well have trouble reading the more complex ones, but writing them isn't as difficult- you construct the expression step by step. So, take a step and follow me into the rabbit hole.
ru: Это неизбежно будет чем-то техническим, ведь регулярные выражения - это технический инструмент для выполнения технических задач. Мне придется использовать жаргон и понятия, которые могут показаться сложными или запутанными. Я попытаюсь объяснить эти концепции настолько ясно, насколько смогу, но на самом деле не могу обойтись без их использования. Это, как говорится, не обескураживайся никаким жаргоном, так как я пытался объяснить все новое. И хотя регулярные выражения сами по себе могут показаться тайной, черной магией (или, если быть более прозаичным, случайной цепочкой букв и знаков мумбо-юмбо), я обещаю, что они не так уж и сложны. Даже те, кто действительно хорошо понимает регулярные выражения, испытывают затруднения при чтении более сложных, но написание их не так сложно - вы строите выражение шаг за шагом. Итак, сделайте шаг и следуйте за мной в кроличью нору.

en: Where in calibre can you use regular expressions?
ru: Где в calibre вы можете использовать регулярные выражения?

en: There are a few places calibre uses regular expressions. There's the :guilabel:`Search & replace` in conversion options, metadata detection from filenames in the import settings and Search & replace when editing the metadata of books in bulk. The calibre book editor can also use regular expressions in its :guilabel:`Search and replace` feature. Finally, you can use regular expressions when searching the calibre book list and when searching inside the calibre E-book viewer.
ru: Есть несколько мест, где calibre использует регулярные выражения. В опциях конвертации есть :guilabel:«Поиск и замена», обнаружение метаданных по именам файлов в настройках импорта и «Поиск и замена» при массовом редактировании метаданных книг. Редактор книг calibre также может использовать регулярные выражения при поиске и замене. Наконец, вы можете использовать регулярные выражения при поиске в списке книг и при поиске в просмотрщике электронных книг.

en: What on earth *is* a regular expression?
ru: Что на земле *является* регулярным выражением?

en: A regular expression is a way to describe sets of strings. A single regular expression can *match* a number of different strings. This is what makes regular expression so powerful -- they are a concise way of describing a potentially large number of variations.
ru: Регулярное выражение - это способ описания наборов строк. Одно регулярное выражение может *соответствовать* ряду различных строк. Это то, что делает регулярные выражения такими мощными - они представляют собой краткий способ описания потенциально большого числа вариаций.

en: I'm using string here in the sense it is used in programming languages: a string of one or more characters, characters including actual characters, numbers, punctuation and so-called whitespace (linebreaks, tabulators etc.). Please note that generally, uppercase and lowercase characters are not considered the same, thus "a" being a different character from "A" and so forth. In calibre, regular expressions are case insensitive in the Search bar, but not in the conversion options. There's a way to make every regular expression case insensitive, but we'll discuss that later. It gets complicated because regular expressions allow for variations in the strings it matches, so one expression can match multiple strings, which is why people bother using them at all. More on that in a bit.
ru: Я использую здесь строку в том смысле, в каком она используется в языках программирования: строка из одного или нескольких символов, символов, включая действительные символы, цифры, знаки препинания и так называемые пробелы (переносы строк, табуляторы и т. д.). Обратите внимание, что обычно прописные и строчные буквы не считаются одинаковыми, поэтому «а» - это символ, отличный от «А» и т. д. В calibre регулярные выражения не чувствительны к регистру в строке поиска, но не в параметрах преобразования. Есть способ сделать каждое регулярное выражение нечувствительным к регистру, но мы обсудим это позже. Это усложняется тем, что регулярные выражения допускают изменения в соответствующих им строках, поэтому одно выражение может соответствовать нескольким строкам, поэтому люди вообще не хотят их использовать. Подробнее об этом чуть позже.

en: Care to explain?
ru: Хотите объяснений?

en: Well, that's why we're here. First, this is the most important concept in regular expressions: *A string by itself is a regular expression that matches itself*. That is to say, if I wanted to match the string ``"Hello, World!"`` using a regular expression, the regular expression to use would be ``Hello, World!``. And yes, it really is that simple. You'll notice, though, that this *only* matches the exact string ``"Hello, World!"``, not e.g. ``"Hello, wOrld!"`` or ``"hello, world!"`` or any other such variation.
ru: Ну, вот почему мы здесь. Во-первых, это самая важная концепция в регулярных выражениях: *Сама строка является регулярным выражением, которое соответствует самому себе*. То есть, если бы я хотел сопоставить строку ``"Hello, World!"`` С помощью регулярного выражения, используемое регулярное выражение было бы ``Hello, World!``. И да, это действительно так просто. Однако заметьте, что это  соответствует *только* точной строке ``"Hello, World!"``, а не, например. ``"Hello, wOrld!"`` или ``"hello, world!" `` или любому другому подобному варианту.

en: That doesn't sound too bad. What's next?
ru: Это звучит не так уж плохо. Что дальше?

en: Next is the beginning of the really good stuff. Remember where I said that regular expressions can match multiple strings? This is where it gets a little more complicated. Say, as a somewhat more practical exercise, the e-book you wanted to convert had a nasty footer counting the pages, like "Page 5 of 423". Obviously the page number would rise from 1 to 423, thus you'd have to match 423 different strings, right? Wrong, actually: regular expressions allow you to define sets of characters that are matched: To define a set, you put all the characters you want to be in the set into square brackets. So, for example, the set ``[abc]`` would match either the character "a", "b" or "c". *Sets will always only match one of the characters in the set*. They "understand" character ranges, that is, if you wanted to match all the lower case characters, you'd use the set ``[a-z]`` for lower- and uppercase characters you'd use ``[a-zA-Z]`` and so on. Got the idea? So, obviously, using the expression ``Page [0-9] of 423`` you'd be able to match the first 9 pages, thus reducing the expressions needed to three: The second expression ``Page [0-9][0-9] of 423`` would match all two-digit page numbers, and I'm sure you can guess what the third expression would look like. Yes, go ahead. Write it down.
ru: Следующее - начало действительно хороших вещей. Помните, где я говорил, что регулярные выражения могут соответствовать нескольким строкам? Здесь все становится немного сложнее. Скажем, в качестве более практичного упражнения электронная книга, которую вы хотели преобразовать, имела неприятный нижний колонтитул, подсчитывающий страницы, например «Страница 5 из 423». Очевидно, что номер страницы увеличится с 1 до 423, поэтому вам нужно будет сопоставить 423 различных строки, верно? Неправильно, на самом деле: регулярные выражения позволяют вам определять наборы символов, которые соответствуют: Чтобы определить набор, вы помещаете все символы, в набор в квадратных скобках. Так, например, набор ``[abc]`` будет соответствовать символу "a", "b" или "c". * Наборы всегда будут соответствовать только одному из символов в наборе *. Они «понимают» диапазоны символов, то есть, если вы хотите сопоставить все символы нижнего регистра, вы должны использовать набор ``[az]`` для символов нижнего и верхнего регистра, которые вы используете ``[a-zA -Z]`` и так далее. Есть идея? Таким образом, очевидно, что с помощью выражения ``Page [0-9] of 423`` вы сможете сопоставить первые 9 страниц, сократив количество выражений до трех: Второе выражение ``Page [0-9] [0-9] of 423`` будет соответствовать всем двузначным номерам страниц, и я уверен, что вы можете догадаться, как будет выглядеть третье выражение. Да, начинайте. Запишите это

en: Hey, neat! This is starting to make sense!
ru: Эй, аккуратно! Это начинает иметь смысл!

en: I was hoping you'd say that. But brace yourself, now it gets even better! We just saw that using sets, we could match one of several characters at once. But you can even repeat a character or set, reducing the number of expressions needed to handle the above page number example to one. Yes, ONE! Excited? You should be! It works like this: Some so-called special characters, "+", "?" and "*", *repeat the single element preceding them*. (Element means either a single character, a character set, an escape sequence or a group (we'll learn about those last two later)- in short, any single entity in a regular expression). These characters are called wildcards or quantifiers. To be more precise, "?" matches *0 or 1* of the preceding element, "*" matches *0 or more* of the preceding element and "+" matches *1 or more* of the preceding element. A few examples: The expression ``a?`` would match either "" (which is the empty string, not strictly useful in this case) or "a", the expression ``a*`` would match "", "a", "aa" or any number of a's in a row, and, finally, the expression ``a+`` would match "a", "aa" or any number of a's in a row (Note: it wouldn't match the empty string!). Same deal for sets: The expression ``[0-9]+`` would match *every integer number there is*! I know what you're thinking, and you're right: If you use that in the above case of matching page numbers, wouldn't that be the single one expression to match all the page numbers? Yes, the expression ``Page [0-9]+ of 423`` would match every page number in that book!
ru: Я надеялся, что вы скажете это. Но приготовьтесь, теперь  становится ещё лучше! Мы только что увидели, что используя наборы, мы можем сопоставить один из нескольких символов одновременно. Но вы даже можете повторить символ или набор, сократив число выражений, необходимых для обработки приведенного выше примера с номером страницы, до одного. Да, ОДИН! Вы в  восторге? А должны быть! Это работает так: некоторые так называемые специальные символы "+", "?" и "*", *повторяют единственный элемент, предшествующий им*. (Элемент означает либо один символ, набор символов, escape-последовательность или группу (мы узнаем о последних двух позже), короче говоря, любой отдельный объект в регулярном выражении.) Эти символы называются подстановочными знаками или квантификаторами. Чтобы быть более точным, "?" соответствует *0 или 1* предыдущего элемента, «*» соответствует *0 или более* предыдущего элемента, а «+» соответствует *1 или более* предыдущего элемента. Несколько примеров: выражение ``a?`` будет соответствовать либо "" (это пустая строка, в данном случае не совсем полезная), либо "a", выражение ``a*`` будет соответствовать "", "a", "aa" или любому количеству a в строке, и, наконец, выражение ``a+`` будет соответствовать "a", "aa" или любому количеству a в строке (Примечание: это не будет соответствует пустой строке!). То же самое для множеств: выражение ``[0-9]+`` будет соответствовать *каждому целому числу*! Я знаю, о чем вы думаете, и вы правы: если вы используете это в приведенном выше случае совпадения номеров страниц, разве это не будет единственным выражением, которое будет соответствовать всем номерам страниц? Да, выражение ``Page [0-9]+ of 423`` будет соответствовать каждому номеру страницы в этой книге!

en: A note on these quantifiers: They generally try to match as much text as possible, so be careful when using them. This is called "greedy behaviour"- I'm sure you get why. It gets problematic when you, say, try to match a tag. Consider, for example, the string ``"<p class="calibre2">Title here</p>"`` and let's say you'd want to match the opening tag (the part between the first pair of angle brackets, a little more on tags later). You'd think that the expression ``<p.*>`` would match that tag, but actually, it matches the whole string! (The character "." is another special character. It matches anything *except* linebreaks, so, basically, the expression ``.*`` would match any single line you can think of). Instead, try using ``<p.*?>`` which makes the quantifier ``"*"`` non-greedy. That expression would only match the first opening tag, as intended. There's actually another way to accomplish this: The expression ``<p[^>]*>`` will match that same opening tag- you'll see why after the next section. Just note that there quite frequently is more than one way to write a regular expression.
ru: Примечание к этим квантификаторам: они обычно пытаются найти как можно больше текста, поэтому будьте осторожны при их использовании. Это называется «жадным поведением» - я уверен, вы понимаете, почему. Это становится проблематичным, когда вы, скажем, пытаетесь сопоставить тег. Рассмотрим, например, строку  ``"<p class="calibre2">Title here</p>"`` и, допустим, вы хотите сопоставить открывающий тег (часть между первой парой угловых скобок, чуть подробнее о тегах позже). Можно подумать, что выражение ``<p.*>`` Будет соответствовать этому тегу, но на самом деле оно соответствует всей строке! (Символ "." является другим специальным символом. Он соответствует чему угодно *кроме* переносов строк, поэтому, по сути, выражение ``.*`` будет соответствовать любой отдельной строке, о которой вы можете подумать.) Вместо этого попробуйте использовать ``<p.*?>``, что делает квантификатор ``"*"`` не жадным. Это выражение будет соответствовать только первому открывающему тегу, как и предполагалось. На самом деле есть еще один способ сделать это: выражение ``<p[^>]*>`` будет соответствовать тому же открывающему тегу - вы поймете почему после следующего раздела. Просто отметьте, что довольно часто существует несколько способов написания регулярного выражения.

en: Well, these special characters are very neat and all, but what if I wanted to match a dot or a question mark?
ru: Ну, эти специальные символы очень аккуратные и все такое, но что, если я хочу сопоставить точку или знак вопроса?

en: You can of course do that: Just put a backslash in front of any special character and it is interpreted as the literal character, without any special meaning. This pair of a backslash followed by a single character is called an escape sequence, and the act of putting a backslash in front of a special character is called escaping that character. An escape sequence is interpreted as a single element. There are of course escape sequences that do more than just escaping special characters, for example ``"\t"`` means a tabulator. We'll get to some of the escape sequences later. Oh, and by the way, concerning those special characters: Consider any character we discuss in this introduction as having some function to be special and thus needing to be escaped if you want the literal character.
ru: Конечно, вы можете сделать это: просто поставьте обратную косую черту перед любым специальным символом, и он будет интерпретирован как буквальный символ без какого-либо специального значения. Эта пара с обратной косой чертой, за которой следует один символ, называется escape-последовательностью, а действие по добавлению обратной косой черты перед специальным символом называется экранированием этого символа. Экранирующая последовательность интерпретируется как отдельный элемент. Конечно, существуют escape-последовательности, которые делают больше, чем просто экранирование специальных символов, например, ``"\t"`` означает табулятор. Мы вернемся к некоторым escape-последовательностям позже. Да, и, кстати, в отношении этих специальных символов: рассмотрите любой символ, который мы обсуждаем в этом введении, как имеющий некоторую функцию, которая должна быть особенной и, следовательно, должна быть экранирована, если вы хотите буквальный символ.

en: So, what are the most useful sets?
ru: Итак, какие наборы наиболее полезны?

en: Knew you'd ask. Some useful sets are ``[0-9]`` matching a single number, ``[a-z]`` matching a single lowercase letter, ``[A-Z]`` matching a single uppercase letter, ``[a-zA-Z]`` matching a single letter and ``[a-zA-Z0-9]`` matching a single letter or number. You can also use an escape sequence as shorthand:
ru: Знал, что ты спросишь. Некоторые полезные наборы: ``[0-9]`` соответствует одному числу, ``[az]`` соответствует одной строчной букве, ``[AZ]`` соответствует одной заглавной букве, ``[a-zA-Z]`` сопоставление одной буквы и ``[a-zA-Z0-9]`` сопоставление одной буквы или числа. Также можете использовать escape-последовательность в качестве сокращения::

en: is equivalent to ``[0-9]``
ru: эквивалентно ``[0-9]``

en: is equivalent to ``[a-zA-Z0-9_]``
ru: эквивалентно ``[a-zA-Z0-9_]``

en: is equivalent to any whitespace
ru: эквивалентно любому пробелу

en: "Whitespace" is a term for anything that won't be printed. These characters include space, tabulator, line feed, form feed, carriage return, non-breaking spaces, etc.
ru: «Пробел» (Whitespace) - это термин для всего, что не будет напечатано. Эти символы включают пробел (space), табулятор (tabulator), перевод строки (line feed), перевод формы (form feed), возврат каретки (carriage return), неразрывные пробелы (non-breaking spaces) и т.п.

en: The upper and lower case sets may match both upper and lowercase if the setting to make searches case insensitive is enabled. Such settings are found, for instance in Preferences->Searching in calibre itself and on the Search panel in the calibre :guilabel:`E-book viewer` as well as the calibre :guilabel:`Edit book` tool.
ru: Наборы верхнего и нижнего регистра могут соответствовать как верхнему, так и нижнему регистру, если включена настройка, позволяющая сделать поиск нечувствительным к регистру. Такие настройки находятся, например, в Настройки-Поиск в самом calibre и на панели Поиска в calibre :guilabel:`Просмотрщик электронных книг`, а также в инструменте calibre :guilabel:`Редактировать книгу`.

en: As a last note on sets, you can also define a set as any character *but* those in the set. You do that by including the character ``"^"`` as the *very first character in the set*. Thus, ``[^a]`` would match any character excluding "a". That's called complementing the set. Those escape sequence shorthands we saw earlier can also be complemented: ``"\D"`` means any non-number character, thus being equivalent to ``[^0-9]``. The other shorthands can be complemented by, you guessed it, using the respective uppercase letter instead of the lowercase one. So, going back to the example ``<p[^>]*>`` from the previous section, now you can see that the character set it's using tries to match any character except for a closing angle bracket.
ru: В качестве последней заметки о наборах вы также можете определить набор как любой символ, *но* из набора. Вы делаете это путем включения символа ``"^"`` в качестве *самого первого символа в наборе*. Таким образом, ``[^a]`` будет соответствовать любому символу, кроме "a". Это называется дополнением набора. Те сокращенные последовательности escape-последовательностей, которые мы видели ранее, также могут быть дополнены: ``"\D"`` означает любой нечисловой символ, что эквивалентно ``[^0-9]``. Другие сокращения можно дополнить, как вы уже догадались, используя соответствующую заглавную букву вместо строчной. Итак, возвращаясь к примеру ``<p[^>]*>`` из предыдущего раздела, теперь вы можете видеть, что используемый им набор символов пытается соответствовать любому символу, кроме закрывающей угловой скобки.

en: But if I had a few varying strings I wanted to match, things get complicated?
ru: Но если бы у меня было несколько переменных строк, которые я хотел бы сопоставить, все усложнялось?

en: Fear not, life still is good and easy. Consider this example: The book you're converting has "Title" written on every odd page and "Author" written on every even page. Looks great in print, right? But in e-books, it's annoying. You can group whole expressions in normal parentheses, and the character ``"|"`` will let you match *either* the expression to its right *or* the one to its left. Combine those and you're done. Too fast for you? Okay, first off, we group the expressions for odd and even pages, thus getting ``(Title)(Author)`` as our two needed expressions. Now we make things simpler by using the vertical bar (``"|"`` is called the vertical bar character): If you use the expression ``(Title|Author)`` you'll either get a match for "Title" (on the odd pages) or you'd match "Author" (on the even pages). Well, wasn't that easy?
ru: Не бойся, жизнь всё ещё хороша и легка. Рассмотрим пример: в книге, которую вы конвертируете, на каждой нечетной странице написано «Title», а на каждой четной странице - «Author». Отлично смотрится в печати, верно? Но в электронных книгах это раздражает. Вы можете сгруппировать целые выражения в нормальных скобках, и символ ``"|"`` позволит вам сопоставить *либо* выражение справа, *либо* слева. Объедините их, и всё готово. Слишком быстро для тебя? Хорошо, во-первых, мы группируем выражения для нечетных и четных страниц, получая, таким образом, ``(Title)(Author)`` как два наших необходимых выражения. Теперь мы упростили ситуацию с помощью вертикальной черты (``"|"`` называется символом вертикальной черты): если вы используете выражение ``(Title|Author)``, вы либо получите совпадение для "Title" (на нечетных страницах) или вы должны соответствовать "Author" (на четных страницах). Ну, разве не просто?

en: You can, of course, use the vertical bar without using grouping parentheses, as well. Remember when I said that quantifiers repeat the element preceding them? Well, the vertical bar works a little differently: The expression "Title|Author" will also match either the string "Title" or the string "Author", just as the above example using grouping. *The vertical bar selects between the entire expression preceding and following it*. So, if you wanted to match the strings "Calibre" and "calibre" and wanted to select only between the upper- and lowercase "c", you'd have to use the expression ``(c|C)alibre``, where the grouping ensures that only the "c" will be selected. If you were to use ``c|Calibre``, you'd get a match on the string "c" or on the string "Calibre", which isn't what we wanted. In short: If in doubt, use grouping together with the vertical bar.
ru: Конечно, вы можете использовать вертикальную черту, не используя групповые скобки. Помните, когда я говорил, что квантификаторы повторяют элемент, предшествующий им? Вертикальная черта работает немного по-другому: выражение "Title|Author" также будет соответствовать либо строке "Title", либо строке "Author", как в приведенном выше примере с использованием группировки. *Вертикальная черта выбирает во всём выражении, предшествующее и следующее за ней*. Итак, если вы хотите сопоставить строки «Calibre» и «calibre» и хотите выбирать только между прописными и строчными буквами «c», вам нужно использовать выражение ``(c|C)alibre``, где группировка гарантирует, что будет выбрана только буква «с». Если бы вы использовали ``c|Calibre``, вы бы получили совпадение в строке "c" или в строке "Calibre", что не то, что мы хотели. Вкратце: если есть сомнения, используйте группировку вместе с вертикальной чертой.

en: You missed...
ru: Вы пропустили...

en: ... wait just a minute, there's one last, really neat thing you can do with groups. If you have a group that you previously matched, you can use references to that group later in the expression: Groups are numbered starting with 1, and you reference them by escaping the number of the group you want to reference, thus, the fifth group would be referenced as ``\5``. So, if you searched for ``([^ ]+) \1`` in the string "Test Test", you'd match the whole string!
ru: ... подождите минутку, есть еще одна действительно полезная вещь, которую вы можете сделать с группами. Если у вас есть группа, которую вы ранее сопоставляли, вы можете использовать ссылки на эту группу позже в выражении: Группы нумеруются, начиная с 1, и вы ссылаетесь на них, экранируя номер группы, на которую хотите сослаться, таким образом, пятая группа будет ссылаться как ``\5``. Итак, если вы искали ``([^]+)\1`` в строке "Test Test", вы бы соответствовали всей строке!

en: In the beginning, you said there was a way to make a regular expression case insensitive?
ru: В начале вы сказали, что есть способ сделать регулярное выражение нечувствительным к регистру?

en: Yes, I did, thanks for paying attention and reminding me. You can tell calibre how you want certain things handled by using something called flags. You include flags in your expression by using the special construct ``(?flags go here)`` where, obviously, you'd replace "flags go here" with the specific flags you want. For ignoring case, the flag is ``i``, thus you include ``(?i)`` in your expression. Thus, ``(?i)test`` would match "Test", "tEst", "TEst" and any case variation you could think of.
ru: Да, спасибо, что уделили мне внимание и напомнили. Вы можете сказать calibre, как вы хотите, чтобы определенные вещи обрабатывались с помощью чего-то, называемого флагами. Вы включаете флаги в свое выражение, используя специальную конструкцию ``(?flags go here)``, где, очевидно, вы бы заменили «flags go here» на конкретные флаги, которые вы хотите. Для игнорирования регистра флаг ``i``, таким образом, вы включаете ``(?I)`` в свое выражение. Таким образом, ``(?I)test`` будет соответствовать "Test", "tEst", "TEst" и любым вариантам, которые вы можете придумать.

en: Another useful flag lets the dot match any character at all, *including* the newline, the flag ``s``. If you want to use multiple flags in an expression, just put them in the same statement: ``(?is)`` would ignore case and make the dot match all. It doesn't matter which flag you state first, ``(?si)`` would be equivalent to the above.
ru: Другой полезный флаг позволяет точке соответствовать любому символу, * включая* перевод строки, флаг ``s``. Если вы хотите использовать несколько выражений в выражении, просто поместите их в один и тот же оператор: ``(?is)`` проигнорирует регистр и сделает точку подходящей для всех. Неважно, какой флаг вы указали первым, ``(?si)`` будет эквивалентно приведенному выше.

en: I think I'm beginning to understand these regular expressions now... how do I use them in calibre?
ru: Я думаю, что начинаю понимать эти регулярные выражения сейчас ... как я могу использовать их в calibre?

en: Conversions
ru: Конвертации

en: Let's begin with the conversion settings, which is really neat. In the :guilabel:`Search & replace` part, you can input a regexp (short for regular expression) that describes the string that will be replaced during the conversion. The neat part is the wizard. Click on the wizard staff and you get a preview of what calibre "sees" during the conversion process. Scroll down to the string you want to remove, select and copy it, paste it into the regexp field on top of the window. If there are variable parts, like page numbers or so, use sets and quantifiers to cover those, and while you're at it, remember to escape special characters, if there are some. Hit the button labeled :guilabel:`Test` and calibre highlights the parts it would replace were you to use the regexp. Once you're satisfied, hit OK and convert. Be careful if your conversion source has tags like this example::
ru: Начнем с настроек конвертации, которые действительно аккуратны. В части :guilabel:`Search & replace` вы можете ввести регулярное выражение (сокращение от регулярного выражения), которое описывает строку, которая будет заменена во время преобразования. Аккуратная часть - это волшебник. Нажмите на посох волшебника, и вы получите предварительный просмотр того, что calibre «видит» в процессе конвертации. Прокрутите вниз до строки, которую хотите удалить, выберите и скопируйте её, вставьте в поле регулярных выражений в верхней части окна. Если есть переменные части, такие как номера страниц или вроде того, используйте наборы и квантификаторы, чтобы покрыть их, и пока вы это делаете, не забудьте экранировать специальные символы, если они есть. Нажмите кнопку с надписью :guilabel:`Test`, и calibre выделит части, которые он заменит, если вы будете использовать регулярное выражение. Как только вы удовлетворены, нажмите ОК и конвертируйте. Будьте осторожны, если в вашем источнике конвертацииии есть теги, подобные следующему:

en: (shamelessly ripped out of `this thread <https://www.mobileread.com/forums/showthread.php?t=75594">`_). You'd have to remove some of the tags as well. In this example, I'd recommend beginning with the tag ``<b class="calibre2">``, now you have to end with the corresponding closing tag (opening tags are ``<tag>``, closing tags are ``</tag>``), which is simply the next ``</b>`` in this case. (Refer to a good HTML manual or ask in the forum if you are unclear on this point). The opening tag can be described using ``<b.*?>``, the closing tag using ``</b>``, thus we could remove everything between those tags using ``<b.*?>.*?</b>``. But using this expression would be a bad idea, because it removes everything enclosed by <b>- tags (which, by the way, render the enclosed text in bold print), and it's a fair bet that we'll remove portions of the book in this way. Instead, include the beginning of the enclosed string as well, making the regular expression ``<b.*?>\s*Generated\s+by\s+ABC\s+Amber\s+LIT.*?</b>`` The ``\s`` with quantifiers are included here instead of explicitly using the spaces as seen in the string to catch any variations of the string that might occur. Remember to check what calibre will remove to make sure you don't remove any portions you want to keep if you test a new expression. If you only check one occurrence, you might miss a mismatch somewhere else in the text. Also note that should you accidentally remove more or fewer tags than you actually wanted to, calibre tries to repair the damaged code after doing the removal.
ru: (бессовестно вырванный из этой темы <https://www.mobileread.com/forums/showthread.php?t=75594 ">`_). Вам также придется удалить некоторые теги. В этом примере , я бы рекомендовал начать с тэга ``<b class="calibre2">``, теперь вы должны закончить соответствующим закрывающим тэгом (открывающие тэги - ``<tag>``, закрывающие тэги - ``</tag>``), который просто является следующим ``</b>`` в этом случае. (Обратитесь к хорошему руководству по HTML или спросите на форуме, если вы не уверены в этом.) Открывающий тег можно описать с помощью``<b.*?>``, закрывающий тег с помощью ``</b>``, таким образом, мы могли бы удалить все между этими тегами, используя ``<b. *?>.*?</b>``. Но использование этого выражения было бы плохой идеей, потому что оно удаляет всё, что заключено в <b> -теги - (что, кстати, рендерит вложенный текст жирным шрифтом), и будет справедливо поспорить, что мы удалим части книги таким образом. Вместо этого включите также начало вложенной строки, создав регулярное выражение ``<b.*?>\s*Generated\s+by\s+ABC\s+Amber\s+LIT.*?</b>``. ``\s`` с квантификаторами находятся в здесь вместо того, чтобы явно использовать пробелы, как видно в строке, чтобы поймать любые варианты строки, которые могут возникнуть. Не забудьте проверить, какой из них calibre  удалит, чтобы убедиться, что вы не удаляете те части, которые хотите сохранить, если тестируете новое выражение. Если вы проверите только одно вхождение, вы можете пропустить несоответствие где-то ещё в тексте. Также обратите внимание, что, если вы случайно удалите больше или меньше тегов, чем вы на самом деле хотели, calibre  попытается восстановить повреждённый код после удаления.

en: Adding books
ru: Добавление книг

en: Another thing you can use regular expressions for is to extract metadata from filenames. You can find this feature in the "Adding books" part of the settings. There's a special feature here: You can use field names for metadata fields, for example ``(?P<title>)`` would indicate that calibre uses this part of the string as book title. The allowed field names are listed in the windows, together with another nice test field. An example: Say you want to import a whole bunch of files named like ``Classical Texts: The Divine Comedy by Dante Alighieri.mobi``. (Obviously, this is already in your library, since we all love classical Italian poetry) or ``Science Fiction epics: The Foundation Trilogy by Isaac Asimov.epub``. This is obviously a naming scheme that calibre won't extract any meaningful data out of - its standard expression for extracting metadata is ``(?P<title>.+) - (?P<author>[^_]+)``. A regular expression that works here would be ``[a-zA-Z]+: (?P<title>.+) by (?P<author>.+)``. Please note that, inside the group for the metadata field, you need to use expressions to describe what the field actually matches. And also note that, when using the test field calibre provides, you need to add the file extension to your testing filename, otherwise you won't get any matches at all, despite using a working expression.
ru: Другая вещь, для которой вы можете использовать регулярные выражения, - это извлечение метаданных из имён файлов. Вы можете найти эту функцию в разделе «Добавление книг» в настройках. Здесь есть особенность: вы можете использовать имена полей для полей метаданных, например, ``(?P<title>)`` будет означать, что calibre использует эту часть строки в качестве названия книги. Разрешенные имена полей перечислены в окнах вместе с другим хорошим тестовым полем. Пример: скажем, вы хотите импортировать целую кучу файлов с такими именами, как ``Classical Texts: The Divine Comedy by Dante Alighieri.mobi`` (``Классические тексты: Божественная комедия Данте Алигьери.mobi``). (Очевидно, это уже есть в вашей библиотеке, так как мы все любим классическую итальянскую поэзию) или ``Science Fiction epics: The Foundation Trilogy by Isaac Asimov.epub`` (``Фантастические эпопеи: трилогия Фонда» Исаака Азимова.epub``). Это, очевидно, схема именования, из которой calibre не будет извлекать какие-либо значимые данные - стандартное выражение для извлечения метаданных - ``(?P<title>.+)-(?P<author>[^_]+) ``. Регулярное выражение, которое работает здесь, будет ``[a-zA-Z]+:(?P<title>. +) by (?P<author>.+)``. Обратите внимание, что внутри группы для поля метаданных вам нужно использовать выражения для описания того, что поле действительно соответствует. Также обратите внимание, что при использовании тестового поля calibre вам необходимо добавить расширение файла к вашему тестовому имени файла, иначе вы не получите никаких совпадений, несмотря на использование рабочего выражения.

en: Bulk editing metadata
ru: Массовое редактирование метаданных

en: The last part is regular expression :guilabel:`Search and replace` in metadata fields. You can access this by selecting multiple books in the library and using bulk metadata edit. Be very careful when using this last feature, as it can do **Very Bad Things** to your library! Double-check that your expressions do what you want them to using the test fields, and only mark the books you really want to change! In the regular expression search mode, you can search in one field, replace the text with something and even write the result into another field. A practical example: Say your library contained the books of Frank Herbert's Dune series, named after the fashion ``Dune 1 - Dune``, ``Dune 2 - Dune Messiah`` and so on. Now you want to get ``Dune`` into the series field. You can do that by searching for ``(.*?) \d+ - .*`` in the title field and replacing it with ``\1`` in the series field. See what I did there? That's a reference to the first group you're replacing the series field with. Now that you have the series all set, you only need to do another search for ``.*? -`` in the title field and replace it with ``""`` (an empty string), again in the title field, and your metadata is all neat and tidy. Isn't that great? By the way, instead of replacing the entire field, you can also append or prepend to the field, so, if you *wanted* the book title to be prepended with series info, you could do that as well. As you by now have undoubtedly noticed, there's a checkbox labeled :guilabel:`Case sensitive`, so you won't have to use flags to select behaviour here.
ru: Последняя часть - поиск и замена регулярных выражений в полях метаданных. Вы можете получить доступ к этому, выбрав несколько книг в библиотеке и используя массовое редактирование метаданных. Будьте очень осторожны при использовании этой последней функции, поскольку она может сделать **Очень плохие вещи** для вашей библиотеки! Дважды проверьте, что ваши выражения делают то, что вы хотите, используя тестовые поля, и отмечайте только те книги, которые вы действительно хотите изменить! В режиме поиска по регулярному выражению вы можете искать в одном поле, заменять текст чем-либо и даже записывать результат в другое поле. Практический пример: скажем, ваша библиотека содержала книги из серии Фрэнка Герберта «Дюны», названные после моды ``Dune 1 - Dune``, ``Dune 2 - Dune Messiah`` и так далее. Теперь вы хотите получить ``Dune`` в поле серии. Вы можете сделать это, выполнив поиск ``(.*?) \d+ - .*`` в поле заголовка и заменив его на ``\1`` в поле серии. Видишь, что я там сделал? Это ссылка на первую группу, которой вы заменяете поле серии. Теперь, когда у вас есть все серии, вам нужно только выполнить другой поиск ``.*?-`` в поле заголовка и замените его на ``""`` (пустую строку), снова в поле заголовка, и ваши метаданные будут аккуратными и чистыми. Разве это не здорово? Кстати, вместо замены всего поля вы также можете добавить или добавить к нему поле, так что, если вы *хотите* добавить к названию книги информацию о серии, вы также можете это сделать. Как вы, несомненно, уже заметили, есть флажок с надписью :guilabel:`Чувствительный к регистру`, поэтому вам не придется использовать флаги для выбора поведения здесь.

en: Well, that just about concludes the very short introduction to regular expressions. Hopefully I'll have shown you enough to at least get you started and to enable you to continue learning by yourself- a good starting point would be the `Python documentation for regexps <https://docs.python.org/library/re.html>`_.
ru: Ну, вот и заканчивается очень краткое введение в регулярные выражения. Надеюсь, я покажу вам достаточно, чтобы, по крайней мере, начать работу и продолжить самостоятельное обучение - хорошей отправной точкой будет документация Python для регулярных выражений <https://docs.python.org/library /re.html>`_.

en: One last word of warning, though: Regexps are powerful, but also really easy to get wrong. calibre provides really great testing possibilities to see if your expressions behave as you expect them to. Use them. Try not to shoot yourself in the foot. (God, I love that expression...). But should you, despite the warning, injure your foot (or any other body parts), try to learn from it.
ru: Последнее слово предостережения: регулярные выражения мощная вещь, но в них также легко ошибиться. calibre предоставляет отличные возможности тестирования, чтобы увидеть, ведут ли себя ваши выражения так, как вы ожидаете. Используйте их. Старайтесь не стрелять себе в ногу. (Боже, мне нравится это выражение ...) Но если вы, несмотря на предупреждение, пораните ногу (или любые другие части тела), постарайтесь извлечь из этого уроки.

en: Quick reference
ru: Краткая справка

en: Credits
ru: Признательность

en: Thanks for helping with tips, corrections and such:
ru: Спасибо за помощь с советами, исправлениями и всем таким:

en: kovidgoyal
ru: ovidgoyal

en: For more about regexps see `The Python User Manual <https://docs.python.org/library/re.html>`_. The actual regular expression library used by calibre is: `regex <https://bitbucket.org/mrabarnett/mrab-regex/src/hg/>`_ which supports several useful enhancements over the Python standard library one.
ru: Для получения дополнительной информации о регулярных выражениях см. `Руководство пользователя Python <https://docs.python.org/library/re.html>`_. Актуальная библиотека регулярных выражений, используемая calibre: `regex <https://bitbucket.org/mrabarnett/mrab-regex/src/hg/>`_, поддерживает несколько полезных улучшений по сравнению со стандартной библиотекой Python.
