【问题标题】:Parsing wikipedia internal links using regex使用正则表达式解析维基百科内部链接
【发布时间】:2014-03-17 22:55:33
【问题描述】:

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 标记,但是我将解析 wikipedia 中的所有链接(通过他们的 XML 转储),这意味着我能编写的代码越简单越好.

【问题讨论】:

标签: regex


【解决方案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]] 

输出>>

Link 1
Link 2
Link 3
Link 4

【讨论】:

  • 刚试过这个,好像是从第一个[[正文中开始,到最后一个]]结束。所以如果我有 [[Link 1]] 和 [[Link 2]] 它会给我“[[Link 1]] 和 [[Link 2]]”。
  • 真的吗?让我为你准备一个测试用例。
  • 我的错!!我在某个地方有一个空间......对不起。看起来效果很好。谢谢
  • 好的,测试用例已添加。
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 2016-07-21
  • 2018-09-10
  • 2011-04-22
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多