我搜索了现有问题,但他们似乎没有回答这个具体问题。
我有以下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正则表达式找到并替换它的语法?
答案 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。
我稍微修改了正则表达式。
{
,}
。.*?