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

(перенаправлено с «Википедия:RE»)
Короткая ссылка-перенаправление

Внутренний поиск 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). В случае возникновения трудностей можно обратиться к ботоводам.

Ссылки

править