使用正则表达式解析维基百科的内部链接

时间:2014-03-17 22:55:33

标签: regex

Wiki-markup存储[[和]]之间的链接,也就是说,如果我写[[PageTitle]],Wikipedia将生成一个指向名为 PageTitle 的内部页面的链接。但是,还可以使用[[]]生成其他链接,例如“类别”,“文件”,“帮助”,“特殊”等...

为了排除这些,我提出了以下正则表达式:

\[\[(?!Category|Wikipedia|File|Help|User talk|Special)(.*?)\]\]

这适用于大多数场景,除了引用(我首先不需要)。引用存储在 ref XML标记(<ref></ref>)中。例如:

<ref>"The remedy has been found: libertarian communism."
[http://www.theanarchistlibrary.org/HTML/Sebastien_Faure__Libertarian_Communism.html 
[[Sébastien Faure]. "Libertarian Communism"]</ref>

理想情况下,我可以完全跳过引用,但至少,读取字符串中没有的项目可能会解决这个问题。

我知道大多数人都会告诉我不要使用正则表达式来解析wiki-markup,但是我将解析维基百科中的所有链接(通过他们的XML转储),这意味着我可以编写最轻的代码,这样更好

1 个答案:

答案 0 :(得分:1)

因为看起来你可以使用环顾四周 添加了测试用例

 # \[\[(?!Category|Wikipedia|File|Help|User\ talk|Special)((?:(?![\[\]]).)*)\]\]

 \[\[
 (?!
      Category
   |  Wikipedia
   |  File
   |  Help
   |  User\ talk
   |  Special
 )
 (
      (?:
           (?! [\[\]] )
           . 
      )*
 )
 \]\]

Perl测试用例

$/ = undef;

$str = <DATA>;

while ( $str =~ /\[\[(?!Category|Wikipedia|File|Help|User\ talk|Special)((?:(?![\[\]]).)*)\]\]/g )
{
    print "$1\n";
}


__DATA__

[[Link 1]] and [[Link 2]] 
ref>"The remedy has been found: libertarian communism."
[http://www.theanarchistlibrary.org/HTML/Sebastien_Faure__Libertarian_Communism.html 
[[Sébastien Faure]. "Libertarian Communism"]</ref>
[[Link 3]] and [[Link 4]] 

输出&gt;&gt;

Link 1
Link 2
Link 3
Link 4