#

Синтаксис регулярных выражений

Регулярное выражение - это текстовый шаблон (образец), состоящий из обычных символов (например, символов от а до z) и специальных символов, известных как метасимволы. Этот шаблон описывает одну или более строк, которые должны обеспечить совпадения во время выполнения поиска в предложенном тексте. Регулярное выражение выполняет роль образца для сопоставления некоего символьного шаблона строке, в которой производится поиск.

Вот несколько примеров регулярных выражений, которые могут Вам встретиться:

Шаблон | Соответствие
--- | ---
^\[ \t]*$ | Соответствует пустой строке.
\d{2}-\d{5} | Проверяет на соответствие идентификационный номер, состоящий из 2-х цифр, дефиса и после еще 5-и цифр.
<(.*)>.*<\/\1> | Соответствует HTML тэгу.

Следующая таблица содержит полный список метасимволов и их поведения в контексте регулярных выражений:

Символ | Описание
--- | ---
\ | Помечает следующий за ним символ как специальный символ, литерал, обратную ссылку или восьмеричную escape-последовательность. Например, 'n' соответствует символу "n", а '\n ' уже соответствует символу новой строки. Последовательность '\\' соответствует '\', '\(' соответствует '('.
^ | Соответствует положению в начале входной строки. Если свойство Multiline объекта RegExp установлено в значение True, ^ также соответствует и положению после '\n' или '\r'.
$ | Соответствует положению в конце входной строки. Если свойство Multiline объекта RegExp установлено в значение True, $ также соответствует и положению перед '\n' или '\r'.
* | Соответствует повторению предшествующего подвыражения ноль или более раз. Например, 'zo*' соответствует 'z' и 'zoo'. * является эквивалентом {0,}.
+ | Соответствует повторению предшествующего подвыражения один или более раз. Например, 'zo+' соответствует 'zo' и 'zoo', но не соответствует 'z'. + является эквивалентом {1,}.
? | Соответствует повторению предшествующего подвыражения ноль или один раз. Например, "do(es)?" соответствует "do" в "do" или в "does". ? является эквивалентом {0,1}
{n} | n является положительным целым числом. Соответствует точно n-ному количеству повторений. Например, 'o{2}' не соответствует 'o' в "Bob", но соответствует 2-ум 'o' в "food".
{n,} | n является положительным целым числом. Соответствует хотя бы n-ному количеству повторений. Например, 'o{2,}' не соответствует "o" в "Bob" но соответствует всем 'o' в "foooood". 'o{1,}' является эквивалентом 'o+'. 'o{0,}' является эквивалентом 'o*'.
{n,m} | m и n это положительные целые числа, причем n <= m. Соответствует хотя бы n-ому и не более чем m-ому числу повторений. Например, "o{1,3}" соответствует первым трем 'o' в "fooooood". 'o{0,1}' является эквивалентом 'o?'. Обратите внимание, что Вы не можете размещать пробел между запятой и цифрами.
? | Когда этот символ следует непосредственно за любым другим квантификатором (*, +, ?, {n}, {n,}, {n,m}), тогда шаблон соответствия становится "нежадным". "Нежадный" шаблон соответствует насколько это возможно минимальной части строки, в которой производится поиск, в то время как заданный по умолчанию "жадный" шаблон соответствует максимально возможно большей части этой строки. Например, 'o+?' в строке "oooo" соответствует одиночному "o", в то время как 'o+' соответствует всем 'o'.
. | Соответствует любому одиночному символу, кроме "\n". Чтобы шаблон соответствовал любому одиночному символу, включая и "\n", используйте выражение '[.\n]'.
(шаблон) | Соответствует шаблону и фиксирует это соответствие. Сохраненное соответствие может быть извлечено из коллекции соответствий с помощью объекта SubMatches. Чтобы добиться соответствия самим символам круглых скобок ( ), используйте '\(' или '\)'.
(?:шаблон) | Соответствует шаблону, но при этом не фиксирует это соответствие, то есть является соответствием, не сохраняемым для возможного будущего использования. Удобно применять при объединении частей шаблона с помощью (|) (символа "ИЛИ"). Например, выражение 'industr(?:y|ies)' является более экономичным, чем выражение 'industry|industries'.
(?=pattern) | Положительное "заглядыванием вперед". Соответствует исходной строке в любой точке где начинается соответствие шаблону. Это нефиксируемое соответстствие, а это означает то, что найденное совпадение не сохраняется для возможного последующего использования. Например, 'Windows (?=95|98|NT|2000)' соответствует фрагменту "Windows " в строке "Windows 98", но не соответствует ему в строке "Windows 3.1". "Заглядыванием вперед" не поглощает символы, что означает, что после сопоставления поиск продолжается с позиции, следующей непосредственно за найденным соответствием, а не после символов, включенных в заглядывание вперед.
(?!pattern) | Отрицательное "заглядыванием вперед". Соответствует исходной строке в любой точке где нет начала соответствия шаблону. Это нефиксируемое соответстствие, что означает то, что найденное совпадение не сохраняется для возможного последующего использования. Соответствие с "заглядыванием вперед", происходит при несоответствии строки pattern и без запоминания найденного соответствия. Например, /Windows (?!95|98|NT|2000)/ соответствует фрагменту "Windows " в строке "Windows 3.1", но не соответствует в строке "Windows 98". "Заглядыванием вперед" не поглощает символы, что означает, что после сопоставления поиск продолжается с позиции, следующей непосредственно за найденным соответствием, а не после символов, включенных в заглядывание вперед.
x|y | Соответствует или x, или y. Например, 'z|food' соответствует "z" или "food". '(z|f)ood' соответствует "zood" или "food".
[xyz] | Набор символов. Соответствует любому из заключенных в квадратные скобки символов. Например, '[abc]' соответствует 'a' в "plain".
[^xyz] | Отрицательный набор символов. Соответствует любому символу, кроме заключенных в квадратные скобки. Например, '[^abc]' соответствует 'p' в "plain".
[a-z] | Диапазон символов. Соответствует любому символу из указанного диапазона. Например, '[a-z]' соответствует любому алфавитному символу в нижнем регистре в диапазоне от 'a' до 'z'.
[^a-z] | "Отрицательный" диапазон символов. Соответствует любому символу вне указанного диапазона. Например, '[^a-z]' соответствует любому алфавитному символу, не входящему в диапазон от 'a' до 'z'.
\b | Соответствует границе слова, то есть позиции между словом и пробелом. Например, 'er\b' соответствует 'er' в "never", но не соответствует 'er' в "verb".
\B | Соответствует всем символам, кроме границы слов. 'er\B' соответствует 'er' в "verb", но не 'er' в "never".
\cx | Соответсвует управляющему символу, указанному в x. К примеру, \cM соответстсвует Ctrl-M или символу перевода каретки. Значение x должно находиться в диапазоне A-Z или a-z. Если это не так, c рассматривается как обычная буква 'c'.
\d | Соответствует цифре. Эквивалентно [0-9].
\D | Соответствует нецифровому символу. Эквивалентно [^0-9].
\f | Соответствует символу подачи бланка (FF). Эквивалентно \x0c и \cL.
\n | Соответствует символу перевода строки (LF). Эквивалентно \x0a и \cJ.
\r | Соответствует символу возврата каретки (CR). Эквивалентно \x0d и \cM.
\s | Соответствует любому пробельному символу, включая пробел, табулятор и т.д. Эквивалентно [ \f\n\r\t\v].
\S | Соответствует любому непробельному символу. Эквивалентно [^ \f\n\r\t\v].
\t | Соответствует символу табуляции (HT). Эквивалентно \x09 и \cI.
\v | Соответствует символу вертикальной табуляции (VT). Эквивалентно \x0b и \cK.
\w | Соответствует латинской букве, цифре или подчеркиванию. Эквивалентно '[A-Za-z0-9_]'.
\W | Соответствует любому символу, кроме латинской буквы, цифры или подчеркивания. Эквивалентно '[^A-Za-z0-9_]'.
\xn | n - шестнадцатеричное число, обязательно состоящее из двух цифр. Соответствует символу с шестнадцатеричным кодом n. Например, /\x41/ эквивалентно "A", '\x041' эквивалентно '\x04' & "1". Позволяет использовать ASCII-коды в регулярных выражениях.
\num | num представлено положительным целым числом. Является обратной ссылкой на найденные соответствия. Например, '(.)\1' соответствует двум последовательно расположенным идентичным символам.
\n | Определяет или восьмеричное значение или обратную ссылку. Если \n предшествуют хотя бы n подвыражений, тогда n соответствует n-ной запомненной подстроке. В обратном случае, n соответствует символу с восьмеричным кодом n, если n соответствует восьмеричной цифре (0-7).
\nm | Определяет или восьмеричное значение или обратную ссылку. Если \nm предшествуют хотя бы nm подвыражений, тогда nm - обратная ссылка. Если перед \nm располагается хотя бы n подвыражений, тогда n - это обратная ссылка, за которой расположен обычный символ m. Если ни одно из предыдущих условий не выполняется, тогда \nm соответствует восьмеричному значению nm, где n и m являются восьмеричными цифрами (0-7).
\nml | Соответствует символу с восьмеричным кодом nml, если n является восьмеричной цифрой (0-3), а m и l являются восьмеричными цифрами (0-7).
\un | Соответсвует n, где n является Unicode символом, представленным четырьмя шестнадцатеричными цифрами. Например, \u00A9 соответствует копирайт-символу ©.

Жадность: (Примеч. переводчика: жадный символ из нескольких возможных отвечающих вариантов выберет самый длинный.) по умолчанию, символы *, ?, +, {min,max} являются жадными, поскольку они поглощают все символы, включая последний из тех, что еще отвечают всему шаблону. Чтобы взамен этого, заставить их остановиться на самом коротком из возможных вариантов соответствия, добавьте следом за любым из них знак вопроса. Например, шаблон <.+> (в котором нет знака вопроса) означает: "найти <, за которым следует одна или большее число литер, за которыми следует >". Такой шаблон захватит всю строку <em>text</em>. Добавьте знак вопроса за плюсом: <.+?>. И поиск остановится на первом символе '>', таким образом этот шаблон отвечает только открывающему тегу <em>.

Запросы вперед и назад: выражения (?=...), (?!...), (?<=...), и (?<!...), в которых на месте многоточия размещается любой шаблон, назовем запросами (assertion). Они только запрашивают выполнение некоторого условия, но сами не отвечают каким-либо символам. Например, abc(?=.*xyz) является запросом вперед, проверяющим, существует ли где-либо строка xyz, лежащая правее строки abc (если не существует, то весь шаблон считается не соответствующим). Конструкцию (?=...) называют позитивным запросом вперед, поскольку он требует, чтобы указанный шаблон находил соответствие впереди. Наоборот, (?!...) есть негативный запрос вперед, поскольку он требует, чтобы указанный шаблон НЕ находил соответствие впереди. Подобным же образом, (?<=...) и (?<!...) представляют соответственно позитивный и негативный запросы назад, поскольку они требуют, чтобы указанный шаблон проверял соответствие слева от текущей позиции. Запросы назад более ограничены в возможностях, чем запросы вперед, поскольку не поддерживают кванторы переменного размера *, ?, и +.