Краткая справка о синтаксисе регулярных выражений¶
В этот список помещены наиболее используемые / трудные для запоминания части движка регулярных выражений, доступные в calibre почти везде.
Классы символов¶
Классы символов полезны для краткого представления различных групп символов.
Примеры:
Обозначение |
Класс |
|
Строчные буквы. Не включает символы с ударением и лигатурами. |
|
Строчные буквы от а до я а также цифры от 0 до 9. |
|
Заглавные, строчные буквы, а также тире. Чтобы включить тире в классе, вы должны поместить его в начале или в конце, чтобы не путать его с дефисом, который обозначает диапазон символов. |
|
Любые символы, кроме цифр. Каретка (^), помещенная в начале класса, исключает символы класса (дополненный класс). |
|
Строчные согласные. Класс может быть включен в класс. Символы |
|
Все буквы (включая иностранные акцентированные символы). Сокращенные классы могут использоваться внутри класса |
Пример:
<[^<>]+> to select an HTML tag
Сокращенные классы символов¶
Обозначение |
Класс |
|
Цифра (то же, что и |
|
Любой нецифовой символ (то же, что и |
|
Буквенно-цифровой символ ( |
|
Любой “non-word” («несловесный») символ |
|
Space (пробел), non-breaking space (неразрывный пробел), tab (табуляция), return line (обратная строка) |
|
Любой символ «без пробелов» |
|
Любой символ кроме новой строки. Используйте флажок «dot all» или модификатор regexp |
Квантификаторы¶
Квантификатор |
Количество вхождений выражения, предшествующего квантификатору |
|
0 или 1 повторение регулярного выражения. Эквивалентно |
|
Одно или более повторение регулярного выражения. Эквивалентно |
|
Любое - 0, 1 или более - количество повторений регулярного выражения. Эквивалентно |
|
Ровно n повторений регулярного выражения. |
|
Количество повторений регулярного выражения, не менее min раз и не более max раз. |
|
Не менее min повторений регулярного выражения. |
|
Количество вхождений между 0 и включенным максимальным значением |
Жадность¶
По умолчанию в квантификаторах механизм регулярных выражений является жадным: он максимально расширяет выбор. Поначалу это часто вызывает сюрпризы. ``? `` следует за квантификатором, чтобы сделать его ленивым. Старайтесь не ставить два в одном выражении, результат может быть непредсказуемым.
Остерегайтесь вложенных квантификаторов, например, шаблона (a*)*
, поскольку он экспоненциально увеличивает время обработки.
Перечисление¶
Символ |
в регулярном выражении соответствует логическому ИЛИ
(OR
). Т. е. могут совпадать либо предыдущее, либо последующее выражения.
Исключение¶
Метод 1
шаблон_исключения(*SKIP)(*FAIL)|шаблон_для_поиска
Пример:
"Blabla"(*SKIP)(*FAIL)|Blabla
выбирает Blabla, в строках Blabla или «Blabla или Blabla», но не в «Blabla».
Метод 2
шаблон_для_исключения\K|(шаблон_для_отбора)
"Blabla"\K|(Blabla)
выбирает Blabla, в строках Blabla или «Blabla или Blabla», но не в «Blabla».
Якоря¶
Якорь - это способ сопоставления логического расположения в строке, а не символа. Наиболее полезными якорями для обработки текста являются:
\b
Обозначает границу слова, то есть переход от пробела к непропробельному символу. Например, вы можете использовать
\bsurd
для сопоставления сsurd
, но неabsurd
.^
Соответствует началу строки (в многострочном режиме, который используется по умолчанию)
$
Соответствует концу строки (в многострочном режиме, который используется по умолчанию)
\K
Сбрасывает начальную позицию выделения в его позицию в шаблоне. Некоторые движки регулярных выражений (но не calibre) не позволяют просматривать данные переменной длины, особенно с квантификаторами. Когда вы можете использовать
\K
с этими движками, это также позволяет вам избавиться от этого предела, написав эквивалент положительного взгляда позади длины переменной.
Группы¶
(выражение)
Группа захвата, которая хранит выбор и может быть вызвана позже в шаблонах search или replace на
\n
, где `` n`` - порядковый номер группы захвата (начиная с 1 в порядке чтения)(?:выражение)
Группа, которая не захватывает выбор
(?>expression)
Атомная группа: как только выражение удовлетворено, обработчик регулярных выражений проходит, и если остальная часть шаблона завершится неудачно, он не будет возвращаться, чтобы попробовать другие комбинации с выражением. Атомные группы не захватывают.
(?|expression)
Группа сброса ветвей: ветви чередований, включенные в выражение, имеют одинаковые номера групп
(?<name>expression)
Группа под названием «имя». Выбор может быть вызван позже в шаблоне search с помощью
(?P=name)
и в replace на\g<name>
. Две разные группы могут использовать одно и то же имя.
Взгляды по сторонам¶
Взгляд по сторонам |
Смысл |
|
Позитивный lookahead (взгляд вперёд) (будет размещен после выделения) |
|
Негативный lookahead (взгляд вперёд) (ставится после выделения) |
|
Позитивный lookbehind (взгляд назад) (ставится перед выделением) |
|
Негативный lookbehind (взгляд назад) (ставится перед выделением) |
Lookaheads (взгляды вперед) и lookbehinds (взгляды назад) не потребляют символы, они имеют нулевую длину и не захватывают. Они являются атомарными группами: как только утверждение выполнено, движок регулярных выражений проходит, и если не удастся остальная часть шаблона, он не будет возвращаться в обход, чтобы попробовать другие комбинации.
При поиске нескольких совпадений в строке, в начальной позиции каждой попытки сопоставления, взгляд назад может проверять символы перед текущей позицией. Поэтому в строке 123 шаблон (?<=\D)\d
(цифра, перед которой стоит цифра) должен теоретически выбрать 2 и 3. С другой стороны, \d\K\d
может выбрать только 2, потому что начальная позиция после первого выбора находится непосредственно перед 3, и для второго совпадения недостаточно цифр. Точно так же \d(\d)
только захватывает 2. В практике движка регулярных выражений calibre положительный взгляд назад (positive lookbehind) ведёт себя таким же образом и выбирает только 2, вопреки теории.
Группы могут быть помещены в lookarounds (взгляды по сторонам), но захват редко полезен. Тем не менее, если это будет полезно, необходимо будет быть очень осторожным при использовании квантификатора во взгляде назад: жадность, связанная с отсутствием обратного отслеживания, может дать неожиданный захват. По этой причине, используйте \K
, а не положительный взгляд назад (positive lookbehind), когда у вас есть квантификатор (или, что еще хуже, несколько) в группе захвата положительного взгляда назад (positive lookbehind).
Пример негативного взгляда вперёд:
(?![^<>{}]*[>}])
Помещенный в конец шаблона препятствует выделению внутри тега или стиля, встроенного в файл.
Когда бы ни было возможно, всегда лучше «закрепить» обходные пути, чтобы уменьшить количество шагов, необходимых для получения результата.
Рекурсия¶
Обозначение |
Смысл |
|
Рекурсия всего шаблона |
|
Рекурсия единственного шаблона нумерованной группы захвата, здесь группа 1 |
Рекурсия вызывает себя. Это полезно для сбалансированных запросов, таких как строки в кавычках, которые могут содержать встроенные строки в кавычках. Таким образом, если во время обработки строки между двойными кавычками мы сталкиваемся с началом новой строки между двойными кавычками, мы хорошо знаем, как это сделать, и мы вызываем себя. Тогда у нас есть шаблон, вроде:
start-pattern(?>atomic sub-pattern|(?R))*end-pattern
Чтобы выбрать строку между двойными кавычками, не останавливаясь на встроенной строке:
“((?>[^“”]+|(?R))*[^“”]+)”
Этот шаблон также можно использовать для изменения пар тегов, которые могут быть встроены, таких как теги <div>
.
Специальные символы¶
Обозначение |
Символ |
|
табуляция |
|
Разрыв строки |
|
(разрываемый) пробел |
|
неразрываемый пробел |
Мета-символы¶
Мета-символы - это те, которые имеют особое значение для движка регулярных выражений. Из них двенадцати должен предшествовать escape-символ, обратная косая черта (\
), чтобы потерять свое особое значение и снова стать обычным символом:
^ . [ ] $ ( ) * + ? | \
Семи другим метасимволам не обязательно должен предшествовать обратный слеш (но он может быть без каких-либо других последствий):
{ } ! < > = :
Специальные символы теряют свой статус, если они используются внутри класса (между скобками []
). Закрывающая скобка и тире имеют особый статус в классе. Вне класса тире - это простой литерал, закрывающая скобка остается метасимволом.
Косая черта (/) и знак числа (или хэш-символ) (#) не являются метасимволами, их не нужно экранировать.
В некоторых инструментах, таких как regex101.com с движком Python, двойные кавычки имеют специальный статус разделителя и должны быть экранированы, либо параметры изменены. Это не так в редакторе calibre.
Режимы¶
(?s)
Заставляет точку (
.
) совпадать с символами новой строки(?m)
Заставляет якоря
^
и$
соответствовать началу и концу строк вместо начала и конца всей строки.