确定查询是否在字符串中

时间:2011-10-16 16:33:21

标签: python

我有一个查询术语列表,每个术语都有一个与之关联的布尔运算符,比如说:

tom OR jerry OR desperate AND dan OR mickey AND mouse

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

我的问题是,在Python中,有没有办法确定用户定义的字符串是否包含“查询”中的单词?

我试过这个:

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

但它没有给出我期望的输出。 如您所见,我不关心查询术语是否有序;只是他们是否在字符串中。

可以这样做吗?我错过了像图书馆那样可以帮助我实现所需功能的东西吗?

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

检查列表中的任何单词是否在字符串中:

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,请不要忘记转义单词以避免与正则表达式语法冲突:

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)

答案 1 :(得分:1)

我会使用正则表达式:

>>> 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是要搜索的字符串,ls中应包含的字词列表。如果搜索功能未返回None,则表示您匹配。

答案 2 :(得分:0)

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)