Регулярное выражение Python для поиска содержимого ссылок разметки MediaWiki
Вопрос
Если у меня есть XML-файл, содержащий такие вещи, как следующая разметка mediawiki:
«... собрано в 12 -м веке, из которых [[Александр Великий] был героем, и в котором он был представлен, что -то вроде англичан [[король Артур | Артур]]»
какие будут подходящие аргументы для чего-то вроде:
re.findall([[__?__]], article_entry)
Я немного спотыкаюсь о том, чтобы избежать двойных квадратных скобок и получить правильную ссылку для текста, например: [[Alexander of Paris|poet named Alexander]]
Решение
Вот пример
import re
pattern = re.compile(r"\[\[([\w \|]+)\]\]")
text = "blah blah [[Alexander of Paris|poet named Alexander]] bldfkas"
results = pattern.findall(text)
output = []
for link in results:
output.append(link.split("|")[0])
# outputs ['Alexander of Paris']
Версия 2 добавляет больше в регулярное выражение, но в результате меняет вывод:
import re
pattern = re.compile(r"\[\[([\w ]+)(\|[\w ]+)?\]\]")
text = "[[a|b]] fdkjf [[c|d]] fjdsj [[efg]]"
results = pattern.findall(text)
# outputs [('a', '|b'), ('c', '|d'), ('efg', '')]
print [link[0] for link in results]
# outputs ['a', 'c', 'efg']
Версия 3, если вам нужна только ссылка без заголовка.
pattern = re.compile(r"\[\[([\w ]+)(?:\|[\w ]+)?\]\]")
text = "[[a|b]] fdkjf [[c|d]] fjdsj [[efg]]"
results = pattern.findall(text)
# outputs ['a', 'c', 'efg']
Другие советы
Регулярное выражение: \w+( \w+)+(?=]])
вход
[[Александр Парижский|поэт по имени Александр]]
выход
поэт по имени Александр
вход
[[Александр Парижский]]
выход
Александр Парижский
import re
pattern = re.compile(r"\[\[([\w ]+)(?:\||\]\])")
text = "of which [[Alexander the Great]] was somewhat like [[King Arthur|Arthur]]"
results = pattern.findall(text)
print results
Дал бы результат
["Alexander the Great", "King Arthur"]
Если вы пытаетесь получить все ссылки со страницы, конечно, гораздо проще использовать MediaWiki API, если это вообще возможно, например. http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=Stack_Overflow_(веб-сайт).
Обратите внимание, что оба эти метода пропускают ссылки, встроенные в шаблоны.