我有一个查询术语列表,每个术语都有一个与之关联的布尔运算符,比如说:
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"
但它没有给出我期望的输出。 如您所见,我不关心查询术语是否有序;只是他们是否在字符串中。
可以这样做吗?我错过了像图书馆那样可以帮助我实现所需功能的东西吗?
非常感谢您的帮助。
答案 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
是要搜索的字符串,l
是s
中应包含的字词列表。如果搜索功能未返回None
,则表示您匹配。
答案 2 :(得分:0)
if ('tom' or 'jerry' or 'desperate' and 'dan' or 'mickey' and 'mouse') in "cartoon dan character desperate"
并不代表您认为的含义,因为括号会导致首先评估or
和and
操作,例如:
>>> "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)