<pre><code>>>> import re
>>> oldString = "this is my {{string-d}}"
>>> oldString2 = "this is my second{{ new_string-d }}"
>>> re.sub(r"(\w*-d)", r"(\1)", oldString)
'this is my {{(string-d)}}'
>>> re.sub(r"(\w*-d)", r"(\1)", oldString2)
'this is my second{{ (new_string-d) }}'
</code></pre>
<p>注意,这与“words”匹配,假设一个单词只由字母、数字和下划线组成。在</p>
<hr/>
<p>以下是对正在发生的事情的更彻底的分析:</p>
<ul>
<li>字符串文本之前的<code>r</code>表示该字符串是“原始字符串”。它阻止Python将字符解释为转义序列。例如,<code>r"\n"</code>是后跟字母n的斜杠,而不是被解释为单个换行符。我喜欢在正则表达式模式中使用原始字符串,尽管这并不总是必需的。在</li>
<li>围绕<code>\w*-d</code>的括号是一个捕获组。它向regex引擎指示应该保存组的内容以供以后使用。在</li>
<li>序列<code>\w</code>表示“任何字母数字字符或下划线”。在</li>
<li><code>*</code>表示“前一项的零个或多个”。<code>\w*</code>一起表示“零个或多个字母数字字符或下划线”。在</li>
<li><code>-d</code>意思是“一个连字符后跟字母d</li>
</ul>
<p>总之,<code>(\w*-d)</code>表示“零个或多个字母数字字符或下划线,后跟连字符和字母d。保存所有这些字符以备以后使用。”</p>
<p>第二个字符串描述应该用什么替换匹配的数据。“\“1”是指“第一个捕获组的内容”。圆括号只是普通的圆括号。总之,<code>(\1)</code>在这个上下文中的意思是“从捕获的组中获取保存的内容,将其括在括号中,并将其放回字符串中”。在</p>
<hr/>
<p>如果您想匹配更多的字符,而不仅仅是字母数字和下划线,您可以将<code>\w</code>替换为您想要匹配的任何字符集合。在</p>
^{pr2}$
<p>如果还想匹配以“-d()”结尾的单词,可以用<code>\(\)</code>匹配括号对,并使用<code>?</code>将其标记为可选。在</p>
<pre><code>>>> re.sub(r"([\w\.\[\]]*-d(\(\))?)", r"(\1)", "{{startingHere[zero1].my_string-d() }}")
'{{(startingHere[zero1].my_string-d()) }}'
</code></pre>