Skip to main content
 首页 » 编程设计

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

2024年08月30日38Renyi-Fan

问题

我正在将 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 .