2009-05-01 3 views
3

Если у меня есть некоторые XML, содержащий такие вещи, как следующий Mediawiki разметке:Python регулярное выражение для поиска содержимого MediaWiki разметки ссылки

"... собраны в 12-м веке, из которых [[Александр Македонский]] был герой, и в котором он был представлен, несколько, как британский [[King Arthur | Arthur]]»

что бы соответствующие аргументы что-то вроде:

re.findall([[__?__]], article_entry)

Я спотыкаясь немного на побег двойные квадратные скобки, и получить правильную ссылку для текста, как: [[Alexander of Paris|poet named Alexander]]

ответ

5

Ниже приведен пример

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'] 

Version 2, ставит больше в regex, но в результате изменяется выход:

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'] 
+0

Я использую '\ [\ [(. +?) \] \]' Для своих целей. Это несколько короче. :) – Gandaro

1

RegExp: \ W + (\ W +) + (=]]?)

входного

[[Александр Париже | поэт по имени Александр]]

поэт по имени Александр

вход

[[Александр Париж]]

выход

Александр Париж

+0

Это не нужный выход. ;) – Gandaro

1
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"] 
1

Если вы пытаетесь получить все ссылки со страницы, конечно, гораздо проще использовать MediaWiki API, если это вообще возможно, например. http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=Stack_Overflow_(website).

Обратите внимание, что оба этих метода пропускают ссылки, встроенные в шаблоны.

+1

На самом деле я работаю с дампа, спасибо за подсказку, хотя – unmounted

Смежные вопросы