Википедия:Регулярные выражения

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Короткая ссылка-перенаправление

Внутренний поиск MediaWiki поддерживает фильтр по регулярным выражениям. Поскольку текстовый поиск (включая поиск по исходному коду insource:) игнорирует знаки препинания, а буквы приводит в единый регистр, регулярные выражения — это единственный способ искать точную подстроку с учётом регистра.

Синтаксис ключа: insource:/регулярное выражение/

Памятка:

  1. Не забывайте экранировать все метасимволы, даже если это кажется вам избыточным (подробнее).
  2. Раскрывайте символьные классы (подробнее).
  3. Ограничивайте область поиска дополнительными ключами (подробнее).

Краткая справка по регулярным выражениям[править код]

Регулярные выражения — формальный язык, используемый в задачах на поиск и замену подстроки в тексте. Поскольку поиск MediaWiki накладывает свои ограничения, некоторые из которых контринтуитивны, данная справочная страница подразумевает, что вы уже знакомы с регулярными выражениями и умеете ими пользоваться. Тем не менее, краткая шпаргалка по синтаксису регулярных выражений может быть полезна:

  • Буквы и цифры в регулярном выражении используются для посимвольного поиска. Так, регулярное выражение АК2 в тексте «Kaganer принимал участие в АК1, АК2, АК4, АК5, АК7, АК28 и АК29» найдёт три вхождения (выделены зелёным).
  • Квадратные скобки обозначают набор символов. Так, регулярное выражение co[dvw]er найдёт любое из слов «coder», «cover» и «cower».
    • Дефис внутри набора символов обозначает диапазон: [0-9] — любая цифра, [А-ЯЁа-яё] — любая буква русского алфавита («ё» не находится между «а» и «я» в таблице Юникода, потому её нужно указывать отдельно).
    • Символ ^ в после открывающей квадратной скобки инвертирует набор: [^0-9] — не цифра; [^ ] — любой символ, кроме пробела.
  • Символ точки обозначает «любой символ». Так, выражение хорош.. найдёт «хороший», «хорошая», «хорошее», и так далее — а также, например, подстроку «хорош к» в тексте «хорош кузнец».
  • В фигурных скобках можно указать число повторений: a{3} найдёт «aaa», [0-9]{2,4} найдёт число длиной от 2 до 4 символов, [А-ЯЁа-яё]{5,} найдёт русское слово длиной от 5 до бесконечности букв.
    • Знак вопроса обозначает, что предыдущий символ может быть опущен (аналогично {0,1}): так, регулярное выражение colou?r найдёт слова «color» и «colour».
    • Знак звёздочки означает, что предыдущий символ может быть повторен от 0 до бесконечности раз (аналогично {0,}): lo*l найдёт «ll», «lol», «lool», и так далее.
    • Знак плюса означает, что предыдущий символ может быть повторен от 1 до бесконечности раз (аналогично {1,}): lo+l найдёт «lol», «lool», «loool», и так далее.
  • Круглые скобки объединяют символы в единую группу, следующее за закрывающей скобкой число повторений будет относиться ко всей группе. Так, ха(-ха)+ найдёт подстроки «ха-ха», «ха-ха-ха», «ха-ха-ха-ха», и так далее.
  • Символ «|» делит группу (в случае, если «|» находится внутри скобок) или выражение (если вне) на два; поиск найдёт любое из них. Так, выражение co[dvw]er может быть переписано в виде coder|cover|cower, либо в виде co(d|v|w)er.
  • Если вам нужно найти в строке символ, имеющий специальное назначение — например, символ из списка выше, — вам нужно его экранировать, добавив перед ним символ «\». Так, выражение, ищущее код {{примечания|2}}, будет выглядеть следующим образом: \{\{примечания\|2\}\}. Если вы не уверены, какие символы являются управляющими, вы можете добавлять «\» к любому символу, кроме букв и цифр.

Особенности поиска MediaWiki[править код]

В основе регулярных выражений движка Lucene, используемого в MediaWiki, лежат расширенные регулярные выражения POSIX, но есть и различия:

  • Оператор точка . находит любые символы, включая перевод строки.
  • Нет операторов ^ (начало строки) и $ (конец строки).
  • Поддерживаются «ленивые» операторы (например, .*?).
  • Добавлен оператор <> для поиска по диапазону чисел, например: <1997-2006> год в компьютерных играх
  • Для нечувствительности к регистру можно дописать i после закрывающего слэша: insource:/регулярное выражение/i.
  • Для экранирования можно не только добавлять обратный слэш к экранируемому символу, но и заключать часть текста в кавычки: "{{примечания}}" вместо \{\{примечания\}\}.

При этом большинство функций PCRE недоступно, в частности:

  • Все специальные символы нуждаются в экранировании (.?*+\/|[](){}<>"@#~, а также - внутри []) — даже там, где из контекста понятно, что это часть текста.
  • Нельзя использовать символьные классы, такие как \n (перенос строки), \s (пробельный символ) или \d (цифра).

Последнее можно обходить заменой на наборы:

Примеры замен символьных классов
PCRE MediaWiki Описание
\d [0-9] цифра
\D [^0-9] не цифра
\n [^ -􏿽] перевод строки (также может найти символ табуляции)
[^\n\t] [ -􏿽] любой символ, кроме перевода строки и табуляции
\s [^!-􏿽] пробельный символ (пробел, перевод строки или табуляция)
\S [!-􏿽] любой непробельный символ (не пробел, не перевод строки и не табуляция)

В диапазонах « » используется как первый символ, следующий за управляющими, «!» — как следующий за ним, а «􏿽» — как символ с достаточно большим кодом, чтобы все реально используемые в статьях символы располагались в кодовых таблицах раньше него. Таким образом, диапазон от « » до «􏿽» включает все символы, кроме управляющих (из которых в статьях могут встретиться перевод строки и табуляция), а диапазон от «!» до «􏿽» — все, кроме управляющих и пробела.

Оптимизация запроса[править код]

Поиск по регулярным выражениям — процесс ресурсозатратный. За отведённые на поиск 20 секунд движок успевает обработать, в зависимости от сложности запроса, от нескольких десятков до нескольких сотен тысяч страниц; единовременный поиск по всем страницам — которых в русской Википедии миллионы — невозможен.

Поэтому при использовании регулярных выражений следует ограничивать область поиска дополнительными ключами: в случаях, когда запрос содержит несколько ключей, движок сначала примет во внимание менее ресурсозатратные (такие, как prefix: или intitle:), и только в последнюю очередь начнёт фильтровать результаты по регулярному выражению. Например, если вы хотите найти статьи, содержащие в коде ссылку [[США|американский]], используйте запрос insource:"США американский" insource:/\[\[США\|американский\]\]/: первый оператор сократит область поиска до около 20 тыс. статей, с которой движок регулярных выражений справится. Если вам нужно найти определённые включения шаблона, ограничьте область поиска через hastemplate:"название шаблона", а если вы работаете с определённой тематикой — добавьте в запрос incategory:"тематическая категория".

Если этого не хватило, можно разбить запрос на несколько. Например, если ваш запрос по hastemplate:"музыкальный альбом" (около 20 тыс. включений) падает по таймауту, вместо него можно сделать два запроса: insource:"рок" hastemplate:"музыкальный альбом" и -insource:"рок" hastemplate:"музыкальный альбом" (около 10 тыс. включений каждый).

Если желаемая область поиска слишком велика, рассмотрите возможность скачать дамп Википедии и проанализировать его локально на своём компьютере (например, с помощью AutoWikiBrowser, Tools → Database Scanner). В случае возникновения трудностей можно обратиться к ботоводам.

Ссылки[править код]