带有wiki文本的Python正则表达式

时间:2011-02-08 02:40:20

标签: python regex wiki

我正在尝试使用Python正则表达式替换将wikitext更改为普通文本。关于wiki链接有两种格式规则。

  • [[页面名称]]
  • [[页面名称|要显示的文字]]

    (http://en.wikipedia.org/wiki/Wikipedia:Cheatsheet)

以下是一些令我头疼的文字。

  

CD几乎全部由[[披头士乐队]]的[[封面版]]歌曲组成,其中George Martin [[唱片制作人]制作]最初。

上述文字应改为:

  

该CD几乎完全由乔治·马丁最初制作的披头士歌曲的封面版本组成。

[[]]和[[| ]]语法是我的主要问题。我不需要一个复杂的正则表达式。按顺序应用多个(可能是两个)正则表达式替换是可以的。

请赐教我这个问题。

4 个答案:

答案 0 :(得分:7)

wikilink_rx = re.compile(r'\[\[(?:[^|\]]*\|)?([^\]]+)\]\]')
return wikilink_rx.sub(r'\1', the_string)

示例:http://ideone.com/7oxuz

注意:您还可以在http://www.mediawiki.org/wiki/Alternative_parsers中找到一些MediaWiki解析器。

答案 1 :(得分:1)

你走错了路。众所周知,Wiki标记很难解析,并且有很多例外,边缘情况和简单的破坏标记,构建自己的正则表达式几乎是不可能的。既然您正在使用Python,我建议使用mwlib,它将为您付出艰苦的努力:

http://code.pediapress.com/wiki/wiki/mwlib

答案 2 :(得分:0)

我提出了一个正则表达式应该可以解决这个问题。让我知道它是否有任何问题:

r"\[\[(([^\]|]|\](?=[^\]]))*)(\|(([^\]]|\](?=[^\]]))*))?\]\]"

(Ick,我永远不会知道这些东西有多丑!)

第1组应该为您提供维基链接。第4组应该给你链接文本,如果没有管道,则为None。

解释:

  • (([^\]|]|\](?=[^\]]))*)查找不是“|”的所有字符序列要么 ”]]”。它通过查找不是“|”的所有字符序列来做到这一点或“]”,这是一个“]”,后跟一个不是“]”的字符。
  • (\|(([^\]]|\](?=[^\]]))*))?可选地匹配“|”接着是与上面相同的正则表达式,以获取链接文本部分。正则表达式略有改变,因为它允许“|”字符。
  • 显然整个事情都被\[\[ ... \]\]包围。
  • (?=...)符号与正则表达式匹配但不消耗其字符,因此可以随后匹配它们。我使用它以免消耗“|”在“]”之后可能出现的字符。

修改:我修正了正则表达式以允许紧跟在“|”之前的“]”,如[[abcd]|efgh]]中那样。

答案 3 :(得分:0)

这应该有效:

text = "The CD is composed almost entirely of [[cover version]]s of [[The Beatles]] songs which George Martin [[record producer|produced]] originally."
newText = re.sub(r'\[\[([^\|\]]+\|)?([^\]]+)\]\]',r'\2',text)