<p>从注释中可以看出,您不关心字符串长度是否匹配,因此我们不需要测试长度,并且可以使用内置的<code>zip()</code>而不是导入<code>zip_longest()</code>。你知道吗</p>
<pre><code>s1 = 'IAMASTRIPETHA-IWANTTOIGN-RE'
s2 = 'IAMA-TRIPETHATIWA-TTOIGNORE'
s3 = 'IAMA-TRIPETHATIWA-TTOALGORE'
def ignore_dash_match(s1, s2):
return all(c1 == c2 for c1, c2 in zip(s1, s2) if c1 != '-' and c2 != '-')
print ignore_dash_match(s1, s2), ignore_dash_match(s1, s3)
</code></pre>
<p><strong>输出</strong></p>
<pre><code>True False
</code></pre>
<hr/>
<p>下面是另一种方法,它将每个<code>'-'</code>转换为一个“通配符”对象,该对象比较起来等于任何东西。你知道吗</p>
<pre><code>s1 = 'IAMASTRIPETHA-IWANTTOIGN-RE'
s2 = 'IAMA-TRIPETHATIWA-TTOIGNORE'
s3 = 'IAMA-TRIPETHATIWA-TTOALGORE'
class Any:
def __eq__(self, other):
return True
def dash_to_Any(s):
return [Any() if c == '-' else c for c in s]
print dash_to_Any(s1) == dash_to_Any(s2), dash_to_Any(s1) == dash_to_Any(s3)
</code></pre>
<p><strong>输出</strong></p>
<pre><code>True False
</code></pre>
<p>您可以通过使用任意一个实例来稍微提高效率,而不是每次都创建一个新实例。但是要得到更好的版本,请看我对<a href="https://stackoverflow.com/a/29867270/4014959">Searching for a partial match in a list of tuples</a>的回答。你知道吗</p>
<p>当然,如果你不在乎不匹配的长度,你可以这样做</p>
<pre><code>def ignore_dash_match(s1, s2):
return all(c1 == c2 for c1, c2 in zip(dash_to_Any(s1), dash_to_Any(s2)))
</code></pre>