<p>这是一个学习<a href="https://en.wikipedia.org/wiki/Regular_expression" rel="nofollow noreferrer">regular expressions</a>的好机会!正则表达式是一种识别和处理文本模式的方法。Python有一个正则表达式包作为其标准库的一部分。我将假设您在这个答案的其余部分使用python3,其中包名为<code>re</code>。你知道吗</p>
<p>TLDR对您的问题的回答是:</p>
<pre><code>import re
string_without_parens = re.sub(r'(^\()|(\)$)', '', string_maybe_has_parens)
</code></pre>
<p>不过,这是怎么回事?<code>re.sub()</code>函数有三个参数,一个正则表达式字符串(由前导的<code>r</code>表示),一个要替换每个匹配项的字符串,以及要在中替换的字符串。这里的正则表达式是<code>(^\()|(\)$)</code>。那是什么意思?让我们一步一步来:</p>
<ul>
<li>一组圆括号<code>()</code>表示一个捕获组,这些圆括号可以用来获取匹配项,但我使用它们作为一种将我们要查找的字符分组的方法。这个正则表达式中有两个捕获组:<code>(^\()</code>和<code>(\)$)</code>。你知道吗</li>
<li>这两个字符之间有一个<code>|</code>字符,它表示或在正则表达式语言中,所以它在寻找匹配<code>(^\()</code><em>或</em><code>(\)$)</code>的字符。你知道吗</li>
<li>第一个捕获组<code>(^\()</code>:里面有两个东西(好吧,确实有三个,但我们会讲到这一点)。第一个是<code>^</code>,这就是所谓的<em>锚点</em>,这一个特别说,“只看字符串的开头”。第二个(和第三个)字符是<code>\(</code>,表示“我想找一个左括号”。因为括号在正则表达式中使用,所以我们必须使用反斜杠字符来“转义”它。你知道吗</li>
<li>第二个捕获组<code>(\)$)</code>:包含转义的右括号<code>\)</code>和其他锚点。这个锚点表示字符串的结尾,就像<code>^</code>表示开始一样。你知道吗</li>
<li>这个函数表示:“在开头匹配一个左括号,在结尾匹配一个右括号,<code>re.sub()</code>函数表示用'''(即nothing)替换与此模式匹配的任何内容。你知道吗</li>
</ul>
<p>希望有帮助!如果您想更多地使用正则表达式,可以尝试<a href="https://regexr.com/" rel="nofollow noreferrer">regexr</a>,这有助于我了解它们。你知道吗</p>