<p>因为您不知道分隔符在哪里,所以可以生成一个由或regex组成的regex(使用单词边界来避免匹配子单词)。你知道吗</p>
<p>这些正则表达式将在每个字符上使用<code>str.join</code>替换单词的字母和<code>[\s\-]*</code>(将零与“space”或“dash”的多个匹配)</p>
<pre><code>import re
input_string = 'alice is a character from a fairy tale that lived in a wonder - land. A character about whome no one knows much about'
phrases_to_remove = ['wonderland', 'character', 'noone']
the_regex = "|".join(r"\b{}\b".format('[\s\-]*'.join(x)) for x in phrases_to_remove)
</code></pre>
<p>现在来处理“替换除第一个匹配项以外的所有项”部分:让我们定义一个对象,该对象将替换除第一个匹配项以外的所有项(使用内部计数器)</p>
<pre><code>class Replacer:
def __init__(self):
self.__counter = 0
def replace(self,m):
if self.__counter:
return ""
else:
self.__counter += 1
return m.group(0)
</code></pre>
<p>现在将<code>replace</code>方法传递给<code>re.sub</code>:</p>
<pre><code>print(re.sub(the_regex,Replacer().replace,input_string))
</code></pre>
<p>结果:</p>
<pre><code>alice is a character from a fairy tale that lived in a . A about whome knows much about
</code></pre>
<p>(生成的正则表达式非常复杂,顺便说一句:<code>\bw[\s\-]*o[\s\-]*n[\s\-]*d[\s\-]*e[\s\-]*r[\s\-]*l[\s\-]*a[\s\-]*n[\s\-]*d\b|\bc[\s\-]*h[\s\-]*a[\s\-]*r[\s\-]*a[\s\-]*c[\s\-]*t[\s\-]*e[\s\-]*r\b|\bn[\s\-]*o[\s\-]*o[\s\-]*n[\s\-]*e\b</code>)</p>