擅长:python、mysql、java
<p>如果没有要使用的表达式与空字符串匹配(如果要替换,这是一个有效的假设),则可以在<code>|</code>使用表达式之前使用组,然后检查找到匹配项的组:</p>
<p><code>(exp1)|(exp2)|(exp3)</code></p>
<p>或者命名组,这样就不必计算子表达式中的子组</p>
<p>替换功能可以查看哪个组匹配,并从列表中选择替换</p>
<p>我提出了这个实现:</p>
<pre class="lang-py prettyprint-override"><code>
import re
def dictsub(replacements, string):
"""things has the form {"regex1": "replacement", "regex2": "replacement2", ...}"""
exprall = re.compile("|".join("("+x+")" for x in replacements))
gi = 1
replacements_by_gi = {}
for (expr, replacement) in replacements.items():
replacements_by_gi[gi] = replacement
gi += re.compile(expr).groups + 1
def choose(match):
return replacements_by_gi[match.lastindex]
return re.sub(exprall, choose, string)
text = "local foals drink cola"
print(dictsub({"(?<=o)a":"w", "l(?=a)":"co"}, text))
</code></pre>
<p>打印<code>local fowls drink cocoa</code></p>