Python正则表达式多行替换

时间:2013-08-27 14:39:35

标签: python regex python-2.7

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

我有以下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正则表达式找到并替换它的语法?

2 个答案:

答案 0 :(得分:2)

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

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

顺便说一下,另一种改进模式(性能和稳健性)的方法是更明确地重复内部重复,这样他们就不会意外地超越|}:< / p>

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>"

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

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

  • 无需逃避{}
  • 在{..}。
  • 之后删除了捕获组
  • 使用过的非贪婪匹配:.*?