有没有办法按特定顺序测试多个字符串?像这样:
if str.find(["who", "are", "you"], "who the heck are you") != -1:
Print("I AM JOE")
答案 0 :(得分:2)
这会逐字测试,检查每个关键字是否包含在前一个关键字之后。
def find_in_order(text, words):
tokens = text.split()
start = 0
for word in words:
try:
start = tokens.index(word, start) + 1
except:
return False
return True
测试:
>>> find_in_order("who the hell are you", ["who", "are", "you"])
True
>>> find_in_order("who the hell is you", ["who", "are", "you"])
False
>>> find_in_order("you who the hell are you", ["who", "are", "you"])
True
>>> find_in_order("who bare bayou", ["who", "are", "you"])
False
>>> find_in_order("who are you", ["who", "are", "are", "you"])
False
或者使用不在空格处分割的变体,因此who bare byou
会传递:
def find_in_order(text, words):
start = 0
for word in words:
try:
start = text.index(word, start) + len(word)
except:
return False
return True
答案 1 :(得分:1)
这个问题可能有很多场景,首先你需要指定文本中每个单词的频率,例如,如果你有一个如下句子的话:
s = "you who the heck are you"
如果您认为单词在您的示例句中重复了一次,您可以使用list.index
方法并检查索引是否已排序,那么顺序就像单词列表一样:
>>> s = "who the heck are you"
>>>
>>> w = ["who", "are", "you"]
>>> splitted_text = s.split()
>>> indices = [splitted_text.index(i) for i in w]
>>> sorted(indices) == indices
True
请注意,由于str.find()
搜索整个字符串中的模式,因此获取单词索引不是一个正确的选择,因为如果使用{{1},可能会有Areyou
这样的单词找到单词str.find
的索引,它将返回单词开头的索引,直到you
不是单独的单词。
或者,如果您想使用正则表达式,您可以使用you
函数根据单词的顺序创建正则表达式:
str.join()
答案 2 :(得分:0)
不使用正则表达式的另一种方法是使用原始直觉按顺序连续对同一个句子应用查找。在这里,您将使用“减少”功能。它看起来像这样:
reduce(lambda x, y: x[x.find(y):], ["who", "are", "you"], "who the heck are you")
这会不断减少搜索字词列表中的句子。如果最后一个单词存在,则最后一个值将是句子的剩余部分,如果它们不存在,则为最后一个字符。所以你可以写一个这样的函数:
def find_in_order(sentence, word_list):
return reduce(lambda x, y: x[x.find(y):], word_list, sentence).startswith(word_list[-1])
>>> find_in_order('who the heck are you', ['who', 'are', 'you'])
True
有一个问题,如果最后一个单词是单个字符,恰好是句子的最后一个字符,那么它总是返回True。如果这是一个问题,您可以简单地在句子的末尾添加一些与上一个搜索项不匹配的内容。
答案 3 :(得分:-4)
对此进行编码的最简单方法可能是使用正则表达式。代码如下:
import re
if re.search("who\s.*are\s.*you","who the heck are you"):
print("I AM JOE")
在模式who\s.*are\s.*you
中,.*
表示匹配任何字符串,\s
表示匹配空格。