确定查询是否在字符串中

2024-10-04 05:30:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个查询项列表,每个查询项都有一个与之相关联的布尔运算符,例如:

tom OR jerry OR desperate AND dan OR mickey AND mouse

好的,现在我有一个包含用户定义输入的字符串,inputStr。你知道吗

我的问题是,在Python中,是否有方法确定用户定义的字符串是否包含“query”中的单词?你知道吗

我试过这个:

if ('tom' or 'jerry' or 'desperate' and 'dan' or 'mickey' and 'mouse') in "cartoon dan character desperate":
    print "in string"

但它没有给出我所期望的结果。 如您所见,我不关心查询项是否有序,只关心它们是否在字符串中。你知道吗

这能做到吗?我是否遗漏了一些东西,比如可以帮助我实现所需功能的库?你知道吗

非常感谢你的帮助。你知道吗


Tags: orand字符串用户in定义dantom
3条回答

我会使用正则表达式:

>>> import re
>>> s = "cartoon dan character desperate"
>>> l = ['dan', 'mickey', 'mouse']
>>> print re.search('(%s)' % '|'.join(l), s)
<_sre.SRE_Match object at 0x0233AA60>
>>> l = ['nothing']
>>> print re.search('(%s)' % '|'.join(l), s)
None

其中s是要搜索的字符串,l是应该在s中的单词列表。如果search函数不返回None,那么就有一个匹配项。你知道吗

if ('tom' or 'jerry' or 'desperate' and 'dan' or 'mickey' and 'mouse') in "cartoon dan character desperate"

不是您认为的意思,因为括号导致首先计算orand操作,例如:

>>> "tom" or "jerry" or "desperate" and "dan" or "mickey" and "mouse"
'tom'

。。。所以你的if-子句的意思是if 'tom' in "cartoon dan character desperate"。你知道吗

你的意思可能是:

if ('tom' in inputStr) or ('jerry' in inputStr) or ('desperate' in inputStr and 'dan' in inputStr) or ('mickey' in inputStr and 'mouse' in inputStr)

要检查列表中的任何单词是否在字符串中,请执行以下操作:

any(word in string for word in lst)

示例:

# 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)

如果使用re.search()作为@jro suggested,那么不要忘记转义词以避免与regex语法冲突:

import re
m = re.search("|".join(map(re.escape, lst)), string)
if m:
   print "some word from the list is in the string"

上面的代码假定query除了包含的单词之外没有其他意义。如果它确实那么假设'AND'绑定比'OR'强,即'a or b and c'意味着'a or (b and c)'您可以检查字符串是否满足查询:

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

上面的内容可以写得更简洁,但可读性可能较差:

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'))

示例

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

如果您想拒绝部分匹配,例如'dan'不应该匹配'danial',那么您可以代替word in string 可以使用re.search()并添加'\b'

re.search(r"\b%s\b" % re.escape(word), string)

相关问题 更多 >