问题
我正在将 wiki 页面从 FlexWiki 引擎迁移到 FOSwiki 引擎,使用 Python 正则表达式来处理两个引擎标记语言之间的差异。
FlexWiki markup和 FOSwiki markup , 供引用。
大多数转换工作得很好,除了我尝试转换重命名的链接。 这两个 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\]\]
请您参考如下方法:
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]]
查看并测试代码 here .
