<p>可能是@swalladge答案的扩展,但这里我们使用字典的优势,如果我们知道映射的话。(请考虑使用自定义映射函数替换字典。你知道吗</p>
<pre><code>import re
d={'TypeA':'A',
'TypeB':'B',
'Car':'CR',
'Bus':'BS'}
def repl(m):
return '<a my-inner-type="'+d[m.group(1)]+m.group(2)+'">'+m.group(3)+'</a>'
s='<TypeA:1234|Bob Alice> or <TypeB:5678|Nelson Mandela>'
print(re.sub('<(.*?)(:\d+)\|(.*?)>',repl,s))
print()
s='<Bus:1234|Bob Alice> or <Car:5678|Nelson Mandela>'
print(re.sub('<(.*?)(:\d+)\|(.*?)>',repl,s))
</code></pre>
<hr/>
<p><strong>输出</strong></p>
<pre><code><a my-inner-type="A:1234">Bob Alice</a> or <a my-inner-type="B:5678">Nelson Mandela</a>
<a my-inner-type="BS:1234">Bob Alice</a> or <a my-inner-type="CR:5678">Nelson Mandela</a>
</code></pre>
<p>工作示例<a href="https://repl.it/LrX8/0" rel="nofollow noreferrer">here</a>。你知道吗</p>
<hr/>
<p>正则表达式
我们在3个组中捕获我们需要的内容,并通过<a href="https://docs.python.org/3/library/re.html#match-objects" rel="nofollow noreferrer">match object</a>引用它们。粗体突出显示的是我们在regex中捕获的3个组。<br/>
<code><</code><b><code>(.*?)</code></b><b><code>(:\d+)</code></b><code>\|</code><b><code>(.*?)</code></b><code>></code><br/>
我们在<code>repl</code>函数中使用这3个组来返回正确的字符串。你知道吗</p>