<p>这让我在第一次读到你的问题时感到困惑,但是请看一下<a href="https://docs.python.org/2.0/ref/strings.html" rel="nofollow">string literals</a>页</p>
<p>您可能知道,python使用反斜杠字符<code>\</code>作为转义符。因此,要在字符串文本中包含新行,我们键入</p>
<pre><code>s = 'hello\nworld'
</code></pre>
<p>如果我们想要一个真正的反斜杠,我们使用双反斜杠</p>
^{pr2}$
<p>如果反斜杠后面的字符与转义序列不匹配,则反斜杠保持原样</p>
<pre><code>s = '\ ' # space doesn't match any escape sequence, so you get to keep the backslash
</code></pre>
<p>这就是你的<code>\(</code>所发生的事情——你最终得到了<code><backslash><open parnes></code></p>
<p>但是<code>\1</code><em>与转义序列匹配,它是字符的八进制表示的文本。所以不是<code><backslash>1</code>,而是<code><0x01></code>。在</p>
<p>当您在pdb中使用<code>p cmd</code>时,它正在打印字符串的<code>repr</code>,这恰好对不可打印的字符使用了反斜杠转义。这与在pythonshell中使用<code>print cmd</code>不同。在</p>
<pre><code>python shell:
>>> print '\\'
\
pdb:
(Pdb) p '\\'
'\\'
</code></pre>
<p>Pdb显示你只有一个反斜杠。类似于</p>
<pre><code>>>> print repr('\\')
'\\'
</code></pre>
<p>所以当你说</p>
<pre><code>(Pdb) p cmd
"sed -i 's/\\(panic=30\\)/\\1 ignorefs/g' /boot/bootrc"
</code></pre>
<p>所有的双反斜杠对都是单反斜杠字符。与注释中工作示例的不同之处在于,在打开/关闭parens前面有文本反斜杠。在</p>
<p>最后,如果不想担心反斜杠转义,可以使用原始字符串</p>
<pre><code>>>> s = r"sed -i 's/\(panic=30\)/\1 my_cool_option/g' /boot/bootrc"
>>> print s
sed -i 's/\(panic=30\)/\1 my_cool_option/g' /boot/bootrc
>>> print repr(s)
"sed -i 's/\\(panic=30\\)/\\1 my_cool_option/g' /boot/bootrc"
</code></pre>