擅长:python、mysql、java
<p>有几种方法可以达到这个目的。如果这里的<code>reduce</code>有一个意符,这是一种将答案保持在^{<cd2>内的方法:</p>
<pre><code>patterns = ["ave", "avenue", "road", "street"]
string = 'queen ave west'
reduce(lambda s, pat: s[:s.find(pat)+len(pat)] if s.find(pat) > 0 else s, patterns, string)
</code></pre>
<p>但是一个更好的解决方案可能是使用正则表达式。这会将所有可能的“模式”组合到一个正则表达式中,并通过python的正则表达式引擎运行整个过程:</p>
^{pr2}$
<p>如果您可以先使用正则表达式来编译多个地址,则可以先使用以下方法对每个地址进行编译:</p>
<pre><code>import re
patterns = ["ave", "avenue", "road", "street"]
regex = re.compile(r'(.*)(' + '|'.join(patterns) + r')(.*)')
strings = ['queen ave west', 'should stay the same']
sanitized_strings = (regex.sub(r'\1\2', string) for string in strings)
</code></pre>
<p>现在,清理后的字符串包含清理后的字符串版本。您可以使用for循环遍历经过清理的\u字符串,然后打印它们或执行任何其他需要的操作。注意,按照正则表达式的设计方式,如果<code>patterns</code>中没有一个单词出现,整个字符串将匹配第一组。因此,如果没有一个单词出现,它将保持字符串不变,就像您请求的那样。在</p>
<p>我不确定这些是否就是你要找的确切语义。例如,您真的要为“queen ave west”返回“queen ave”吗。另外要注意的是,到目前为止提到的所有解决方案都没有考虑到其中一个模式是以街道的名字命名的,这很可能是因为你的模式包括缩写“st”,或者在多伦多,有一条叫做“Avenue road”的路。这些问题的答案取决于你想要达到的目标。在</p>