我正在尝试使用Python正则表达式替换将wikitext更改为普通文本。关于wiki链接有两种格式规则。
[[页面名称|要显示的文字]]
(http://en.wikipedia.org/wiki/Wikipedia:Cheatsheet)
以下是一些令我头疼的文字。
CD几乎全部由[[披头士乐队]]的[[封面版]]歌曲组成,其中George Martin [[唱片制作人]制作]最初。
上述文字应改为:
该CD几乎完全由乔治·马丁最初制作的披头士歌曲的封面版本组成。
[[]]和[[| ]]语法是我的主要问题。我不需要一个复杂的正则表达式。按顺序应用多个(可能是两个)正则表达式替换是可以的。
请赐教我这个问题。
答案 0 :(得分:7)
wikilink_rx = re.compile(r'\[\[(?:[^|\]]*\|)?([^\]]+)\]\]')
return wikilink_rx.sub(r'\1', the_string)
注意:您还可以在http://www.mediawiki.org/wiki/Alternative_parsers中找到一些MediaWiki解析器。
答案 1 :(得分:1)
你走错了路。众所周知,Wiki标记很难解析,并且有很多例外,边缘情况和简单的破坏标记,构建自己的正则表达式几乎是不可能的。既然您正在使用Python,我建议使用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)