2

我搜索了现有问题,但他们似乎没有回答这个具体问题。

我有以下python程序

description = """\
before

{cs:id=841398|rep=myrepo}: after
"""
pattern = re.compile(r"(.*)\{cs:id=(.*)\|rep=(.*)\}(.*)")

我需要将描述中的正则表达式替换为如下所示,但我无法正确获取模式和替换语法

description="""\
before

<a href="http://crucible.app.com:9090/myrepo?cs=841398">841398</a> : after
"""

crucible.app.com:9090 是我事先拥有的常量,所以我基本上需要用我的替换替换模式。

有人可以告诉我什么是最好的 python 正则表达式查找和替换语法吗?

4

2 回答 2

2

使用re.sub/ RegexObject.sub

>>> pattern = re.compile(r"{cs:id=(.*?)\|rep=(.*?)}")
>>> description =  pattern.sub(r'<a href="http://crucible.app.com:9090/\1?cs=\2">\1</a>', description)
>>> print(description)
before

<a href="http://crucible.app.com:9090/841398?cs=myrepo">841398</a>: after

\1\2参考匹配组1、2。

我稍微修改了正则表达式。

  • 没必要逃{}
  • 在 {..} 之前和之后删除了捕获组。
  • 使用非贪婪匹配:.*?
于 2013-08-27T14:45:03.197 回答
2

(.*)您的模式中不需要第一个和最后一个。要在替换字符串中写回捕获的组,请使用\1and \2

description = re.sub(pattern, "<a href=\"http://crucible.app.com:9090/\2?cs=\1\">\1</a>", description)

顺便说一句,另一种改进模式(性能和鲁棒性)的方法是使内部重复更加明确,这样它们就不会意外超过|or }

pattern = re.compile(r"\{cs:id=([^|]*)\|rep=([^}]*)\}")

您还可以使用命名组:

pattern = re.compile(r"\{cs:id=(?P<id>[^|]*)\|rep=(?P<rep>[^}]*)\}")

然后在替换字符串中:

"<a href=\"http://crucible.app.com:9090/\g<repo>?cs=\g<id>\">\g<id></a>"
于 2013-08-27T14:43:54.147 回答