按照在原始句子中出现的顺序提取所有匹配的子字符串

时间:2019-04-15 15:58:40

标签: python

我有一个存储定义的关键字的列表,例如:

keywords = [
    "white shark",
    "tiger shark",
    "funnel web spider",
    "inland taipan"]

现在我做了一个句子

str = "A tiger shark spotted here, and a white shark, and a funnel web spider"

从这句话,我想产生一个结果["tiger shark", "white shark", "funnel web spider"]。关键字以其在句子中的原始顺序出现在句子中。 然后,我编写了这样的代码

for i in keywords:
    if not str.find(i) == -1:
          result.append(i)

这将给我["white shark", "tiger shark", "funnel web spider"],订单与我的预期结果不同。我的错误很明显。

所以我的问题是如何获得正确的结果顺序。我认为唯一的方法是使用字符串遍历关键字列表。但是我认为它很复杂,因为它涉及许多组合。有帮助吗?非常感谢。

2 个答案:

答案 0 :(得分:4)

这是因为您要按keywords的顺序附加它们,相反,我们应该将其外观索引保存在my_str中,以便以后根据它们在my_str中的出现来对单词进行排序< / p>

keywords = [
    "white shark",
    "tiger shark",
    "funnel web spider",
    "inland taipan"]
my_str = "A tiger shark spotted here, and a white shark, and a funnel web spider"

result = []
for keyword in keywords:
    idx = my_str.find(keyword)
    if idx != -1:
        result.append((idx, keyword))

result = [i[1] for i in sorted(result)]  # Sorts by first item in tuple, idx

print(result) # -> ['tiger shark', 'white shark', 'funnel web spider']

答案 1 :(得分:1)

您可以构建(索引,关键字)列表并对其进行排序。然后从匹配的元组中提取关键字。

keywords = [
"white shark",
"tiger shark",
"funnel web spider",
"inland taipan"]
sentence = "A tiger shark spotted here, and a white shark, and a funnel web spider"

result = [ k for i,k in sorted( (sentence.find(k),k) for k in keywords) if i != -1 ]

print(result)
# ['tiger shark', 'white shark', 'funnel web spider']

您还可以使用正则表达式(形成re模块):

import re

result  = re.findall("|".join(keywords),sentence)