Извлекать сложные ссылки с Python - PullRequest
2 голосов
/ 07 марта 2019

У меня есть RegEx , который должен найти все буквенно-цифровые символы или тексты в квадратных скобках, как в примере выше по ссылке. Эти тексты на самом деле являются ссылками с описаниями (например, [[Toto|there's a link here]] - это ссылка на страницу Toto)

Но проблема в том, что у меня может быть другой текст в квадратных скобках, и, как вы можете видеть по ссылке, он не распознает скобки в конце (]]).

В этих ссылках есть еще один важный паттерн, в котором есть трубы (|), которые разделяют мои тексты на две или три части. В случае, если в нем две части, я хочу получить только текст слева, а в случае, если мне нужно три части, текст справа.

Пример:

[[File:Euclid flowchart 1.png|vignette|[[Flowchart]] of an algorithm ([[Euclid's algorithm]]).]]

Мне нужна только [[Flowchart]] of an algorithm ([[Euclid's algorithm]]). часть (это png с описанием ниже и в этом описании есть другие ссылки)

[[Babylone|Babyloniens]]

хочу Babylone

В первом примере есть другие ссылки внутри, но я могу легко извлечь их с помощью моего первого регулярного выражения или рекурсии.

Вы можете увидеть пример моего кода здесь

1 Ответ

1 голос
/ 07 марта 2019

Вы можете попробовать этот шаблон \[\[(.+?)\|(.+?)(\|(.+))?\]\]

Шаблон захватывает строку групп между трубами |. Я использовал не жадный оператор .+?, иначе он будет захватывать все до последней трубы. Нежадный оператор захватывает до первого появления трубы. Но последний оператор жадный - это потому, что мы хотим захватить все до последнего ]], что противоположно тому, что мы хотели ранее.

Также (\|(.+))? означает, что третья часть (не включая дополнительный характер трубы) является необязательной (может встречаться не более одного раза).

Это также требует дополнительной логики - вам нужно сначала проверить, существует ли четвертая группа захвата, если она есть, это означает, что строка была разделена на три части по конвейерам. Если его нет, то он был разделен только на две части, и в этом случае вы хотите получить первую группу захвата.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...