擅长:python、mysql、java
<p>正则表达式的问题是分组。使用<code>(-)?|( )?</code>作为分隔符并不像您认为的那样。你知道吗</p>
<p>考虑当单词列表为<code>a,b</code>时会发生什么:</p>
<pre><code>>>> regex = "(-)?|( )?".join(["a", "b"])
>>> regex
'a(-)?|( )?b'
</code></pre>
<p>您希望这个正则表达式匹配<code>ab</code>或<code>a b</code>或<code>a-b</code>,但显然它没有这样做。它匹配<code>a</code>、<code>a-</code>、<code>b</code>或<code><space>b</code>!你知道吗</p>
<pre><code>>>> re.match(regex, 'a')
<_sre.SRE_Match object at 0x7f68c9f3b690>
>>> re.match(regex, 'a-')
<_sre.SRE_Match object at 0x7f68c9f3b718>
>>> re.match(regex, 'b')
<_sre.SRE_Match object at 0x7f68c9f3b690>
>>> re.match(regex, ' b')
<_sre.SRE_Match object at 0x7f68c9f3b718>
</code></pre>
<p>要解决这个问题,可以将分隔符括在它自己的组中:<code>([- ])?</code>。你知道吗</p>
<p>如果您还想匹配像<code>wonder - land</code>(即在连字符之前/之后有空格的地方)这样的词,您应该使用下面的<code>(\s*-?\s*)?</code>。你知道吗</p>