Python正则表达式中的方形括号(re.sub)

时间:2012-06-25 15:08:06

标签: python regex

问题

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

FlexWiki markupFOSwiki 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\]\]

3 个答案:

答案 0 :(得分: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]]

查看并测试代码here

答案 1 :(得分: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]]

你的表达可能有其他问题。

答案 2 :(得分: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]]'

一切都很好。