<p>要检查列表中的任何单词是否在字符串中,请执行以下操作:</p>
<pre><code>any(word in string for word in lst)
</code></pre>
<p>示例:</p>
<pre><code># construct list from the query by removing 'OR', 'AND'
query = "tom OR jerry OR desperate AND dan OR mickey AND mouse"
lst = [term for term in query.split() if term not in ["OR", "AND"]]
string = "cartoon dan character desperate"
print any(word in string for word in lst)
</code></pre>
<p>如果使用<code>re.search()</code>作为<a href="https://stackoverflow.com/questions/7785685/determining-if-a-query-is-in-a-string/7785714#7785714">@jro suggested</a>,那么不要忘记转义词以避免与regex语法冲突:</p>
<pre><code>import re
m = re.search("|".join(map(re.escape, lst)), string)
if m:
print "some word from the list is in the string"
</code></pre>
<p>上面的代码假定<code>query</code>除了包含的单词之外没有其他意义。如果它<em>确实</em>那么假设<code>'AND'</code>绑定比<code>'OR'</code>强,即<code>'a or b and c'</code>意味着<code>'a or (b and c)'</code>您可以检查字符串是否满足查询:</p>
<pre><code>def query_in_string(query, string):
for term in query.split('OR'):
lst = map(str.strip, term.split('AND'))
if all(word in string for word in lst):
return True
return False
</code></pre>
<p>上面的内容可以写得更简洁,但可读性可能较差:</p>
<pre><code>def query_in_string(query, string):
return any(all(word.strip() in string for word in term.split('AND'))
for term in query.split('OR'))
</code></pre>
<h3>示例</h3>
<pre><code>query = "tom OR jerry AND dan"
print query_in_string(query, "cartoon jerry") # -> False no dan or tom
print query_in_string(query, "tom is happy") # -> True tom
print query_in_string(query, "dan likes jerry") # -> True jerry and dan
</code></pre>
<p>如果您想拒绝部分匹配,例如<code>'dan'</code>不应该匹配<code>'danial'</code>,那么您可以代替<code>word in string</code>
可以使用<code>re.search()</code>并添加<code>'\b'</code>:</p>
<pre><code>re.search(r"\b%s\b" % re.escape(word), string)
</code></pre>