问题
我正在使用 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\]\]