用字符串匹配列表中的多个单词

时间:2019-02-08 01:16:47

标签: python

我想用输入字符串匹配列表中的多个单词,并返回匹配单词的列表。 例如:

<button id="larrow"></button>

<div id="PanL">
  <table class="panMid">
    <tr class="owstR">
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
    </tr>
    <tr class="owstR">
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
    </tr>
    <tr class="owstR">
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
    </tr>
    <tr class="owstR">
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
    </tr>
    <tr class="owstR">
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
    </tr>
    <tr class="owstR">
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
      <td class="dTs"></td>
    </tr>
  </table>
</div>

输出:

x = input("Enter a string?")
keywords= ["freeway", "doesn't turn on", "dropped", "got sick", "traffic jam", " car accident"]

我进行了研究,有人建议使用any(): 如果有的话(x中的关键字代表关键字中的关键字),但它只会返回true或false。 如何返回匹配单词的列表。有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

[i for i in keywords if i in x]

编辑:这就是您想要的

答案 1 :(得分:0)

您可以使用集合来找出哪些字符串与用户输入的字符串和您的关键字匹配。

检查以下代码:

keywords= ["freeway", "doesn't turn on", "dropped", "got sick", "traffic jam", " car accident"]

user_strings = []

while True:
    x = input("Enter a string?")
    if x == 'exit':
        break
    user_strings.append(x)

print ("User strings = %s" %(user_strings))
print ("keywords = %s" %(keywords))

print ("Matched Words = %s" %(list(set(keywords) & set(user_strings))))

输出:

Enter a string?"doesn't turn on"
Enter a string?"freeway"
Enter a string?"Hello"
Enter a string?"World"
Enter a string?"exit"
User strings = ["doesn't turn on", 'freeway', 'Hello', 'World']
keywords = ['freeway', "doesn't turn on", 'dropped', 'got sick', 'traffic jam', ' car accident']
Matched Words = ['freeway', "doesn't turn on"]

答案 2 :(得分:0)

您可以使用部落和真实的re库。

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {

  int digit = 0;
  int randNo = 0;
  cin >> digit;       
  srand((unsigned)time(NULL));
  vector <int> randG(digit);
            for(int i = 0; i < randG.size(); i++){
                    randNo = rand() %10;
                    randG.at(i) = randNo;
            }
  }

这非常实用,因为不必担心会乱序检索比赛(感谢import re from collections import OrderedDict def get_matches(s, keys, include_duplicates=False): pattern = re.compile('|'.join(map(re.escape, keys))) all_matches = pattern.findall(s, re.IGNORECASE) if not include_duplicates: all_matches = list(OrderedDict.fromkeys(all_matches).keys()) return all_matches 。您可以选择在响应中包含重复项。


说明

我对re所做的全部工作是创建一个模式,以寻找dict.fromkeys *(keywords | keys)* seperated by a re`中的每个字符串,以查找键的所有匹配项。

re.findall按照文档中的说明按顺序返回匹配项:

  

返回字符串中格式的所有非重叠匹配,作为列表   字符串。从左到右扫描字符串,并返回   按照找到的顺序。

这不考虑重复项,因此在需要重复复制的情况下包含this tells参数。您可以将结果变成一组以删除重复项,尽管这样会丢失订单的完整性,因此我使用了collections.OrderedDict并将其转回了列表。


投入使用:

include_duplicates

您可以https://repl.it/repls/AbleEssentialDribbleware自己尝试一下。

修改

按照您在评论中的要求:

为说明这一行的作用,

text = "there is a car accident on the freeway so that why I am late for the show."
keywords= {
  "freeway",
  "doesn't turn on",
  "dropped",
  "got sick",
  "traffic jam",
  " car accident"}
matches = get_matches(text, keywords)
print(f"the list of matched words are: {', '.join(matches)}")
#the list of matched words are:  car accident, freeway, freeway
  • pattern = re.compile('|'.join(map(re.escape, keys))) -根据字符串创建正则表达式模式。 -see the docs
  • re.compile接受一个可迭代的字符串,并使其中一个字符串全部由字符串前面的字符串分隔。 -see the docs
  • joinmap 您可以根据自己的情况采取这项措施 ,但是您或其他阅读本文的人是否应该使用更复杂的方式关键字搜索,它将使用每个关键字并转义re.escape的特殊元字符-(请参阅文档:mapre.escape

此行可以在没有remap的情况下重写,并且仍然可以像这样正常工作:

re.escape

只知道您不能在关键字中包含pattern = re.compile('|'.join(keys)) (等字符。