2

问题

我正在使用 Python 正则表达式将 wiki 页面从 FlexWiki 引擎迁移到 FOSwiki 引擎,以处理两个引擎的标记语言之间的差异。

FlexWiki标记FOSwiki 标记,供参考。

大多数转换工作得很好,除非我尝试转换重命名的链接。两个 wiki 都支持在其标记中重命名链接。

例如,Flexwiki 使用:

"Link To Wikipedia":[http://www.wikipedia.org/]

FOSwiki 使用:

[[http://www.wikipedia.org/][Link To Wikipedia]]

两者都会产生重写的超链接。

我正在使用正则表达式

renameLink = re.compile ("\"(?P<linkText>[^\"]+)\":\[(?P<linkTarget>[^\[\]]+)\]")

从 FlexWiki 标记中解析出链接元素,在运行类似的东西之后

"Link Text":[LinkTarget]

可靠地产生组

<linkText> = Link Text
<linkTarget = LinkTarget

当我尝试使用 re.sub 将解析的内容插入 FOSwiki 标记时,就会出现我的问题。

我在正则表达式方面的经验没什么好写的,但我的印象是,考虑到这些群体

<linkText> = Link text
<linkTarget = LinkTarget

一条线

line = renameLink.sub ( "[[\g<linkTarget>][\g<linkText>]]" , line )

应该产生

[[LinkTarget][Link Text]]

但是,在我得到的文本文件的输出中

[[LinkTarget [[Link Text]]

这会破坏重命名的链接。

经过一番摆弄后,我设法解决了问题,在哪里

line = renameLink.sub ( "[[\g<linkTarget>][ [\g<linkText>]]" , line )

生产

[[LinkTarget][ [[Link Text]]

其中,当在 FOSwiki 中显示时看起来像

[[Link Text

哪个有效,但不是很漂亮。

在我尝试转换的页面中可能有数千个这些重命名链接的实例,因此手动修复它没有任何好处。作为记录,我在 Python 2.5.4 和 Python 2.7.3 下运行了脚本,并得到了相同的结果。

我是否错过了语法上非常明显的东西?或者有没有简单的解决方法?

解决方案

原来的表情没有任何问题。

我开始在我的脚本中运行其他正则表达式,并注释掉我认为可能与重命名链接表达式重叠的行。这似乎已经成功了,作为一个半永久性的修复,我已经将以链接为中心的表达式和其他表达式分离到单独的脚本中,我一个接一个地运行这些脚本。

我想他们在这里的道德是仔细检查你没有重叠的表达。

尝试的解决方案(请参见上面的解决方案)

字符串添加

line = renameLink.sub ( "[[\g<linkTarget>]" + "[\g<linkText>]]" , line )

生产

[[linkTarget [[Link Text]]

不管你如何分割连接,结果都是一样的。

转义方括号,例如

line = renameLink.sub ( "\[\[\g<linkTarget>\]\[\g<linkName>\]\]" , line )

生产

\[ [[LinkTarget\]] [Link Text\]\]
4

3 回答 3

3

Flexwiki 到 FOSwiki

代码:

import re
text = '"Link To Wikipedia":[http://www.wikipedia.org/]'
print re.sub(r'"([^"]+)":\[([^\]]+)\]', r'[[\2][\1]]', text)

输出:

[[http://www.wikipedia.org/][Link To Wikipedia]]

在此处查看并测试代码。

于 2012-06-25T15:57:06.280 回答
0

一条线

line = renameLink.sub ( "[[\g<linkTarget>][\g<linkText>]]" , line )

应该产生

[[LinkTarget][Link Text]]

它确实如此。例子:

line = r""""Link Text":[LinkTarget]"""
renameLink = re.compile("\"(?P<linkText>[^\"]+)\":\[(?P<linkTarget>[^\[\]]+)\]")
print(renameLink.sub ("[[\g<linkTarget>][\g<linkText>]]", line))

输出:

[[LinkTarget][Link Text]]

除了表情之外,您可能还有其他问题。

于 2012-06-25T15:40:46.070 回答
0

我完全按照你说的试了。我正在使用 python 2.7.1 版本。

这是结果

>>> text = '"Link To Wikipedia":[http://www.wikipedia.org/]'
>>> renameLink = re.compile ("\"(?P<linkText>[^\"]+)\":\[(?P<linkTarget>[^\[\]]+)\]")
>>> s = renameLink.match(text)
>>> lnkname, lnk = s.groups()
>>> substr = "[[%s][%s]]" % (lnk, lnkname)
>>> renameLink.sub(substr, text)
'[[http://www.wikipedia.org/][Link To Wikipedia]]'

一切正常。

于 2012-06-25T15:42:09.787 回答