【问题标题】:Search list: match only exact word/string搜索列表:仅匹配精确的单词/字符串
【发布时间】:2011-10-18 02:04:45
【问题描述】:

如何在搜索列表时匹配精确的字符串/单词。我试过了,但它不正确。下面我给出了sample listmy codetest results

list = ['嗨,你好','嗨,12345先生','欢迎先生']

我的代码:

对于列表中的str: 如果 s 在 str 中: 打印字符串

测试结果:

s =“你好”~预期输出:'嗨,你好'~输出我得到:'嗨,你好' s =“123”~预期输出:*没有*~输出我得到:'hi mr 12345' s =“12345”~预期输出:'hi mr 12345'~输出我得到:'hi mr 12345' s = "come" ~ 预期输出:*nothing* ~ 我得到的输出:'welcome sir' s = "welcome" ~ 预期输出:'welcome sir' ~ 输出我得到:'welcome sir' s =“欢迎先生”〜预期输出:'欢迎先生'〜输出我得到:'欢迎先生'

我的列表包含超过 20 万个字符串

【问题讨论】:

    标签: python string string-matching


    【解决方案1】:

    看来您不仅需要执行一次此搜索,因此我建议您将列表转换为字典:

    >>> l = ['Hi, hello', 'hi mr 12345', 'welcome sir']
    >>> d = dict()
    >>> for item in l:
    ...     for word in item.split():
    ...             d.setdefault(word, list()).append(item)
    ...
    

    所以现在你可以轻松做到:

    >>> d.get('hi')
    ['hi mr 12345']
    >>> d.get('come')    # nothing
    >>> d.get('welcome')
    ['welcome sir']
    

    附言可能你必须改进item.split() 来处理逗号、点和其他分隔符。也许使用正则表达式和\w

    p.p.s.正如 cularion 所说,这与“欢迎先生”不匹配。如果您想匹配整个字符串,这只是建议解决方案的另一行。但是,如果您必须匹配由空格和标点符号 regex 界定的字符串的一部分,则应该是您的选择。

    【讨论】:

      【解决方案2】:
      >>> l = ['Hi, hello', 'hi mr 12345', 'welcome sir']
      >>> search = lambda word: filter(lambda x: word in x.split(),l)
      >>> search('123')
      []
      >>> search('12345')
      ['hi mr 12345']
      >>> search('hello')
      ['Hi, hello']
      

      【讨论】:

        【解决方案3】:

        如果您搜索完全匹配:

        for str in list:
          if set (s.split()) & set(str.split()):
            print str
        

        【讨论】:

          【解决方案4】:

          如果s 只包含几个词,你可以这样做

          s = s.split()
          n = len(s)
          for x in my_list:
              words = x.split()
              if s in (words[i:i+n] for i in range(len(words) - n + 1)):
                  print x
          

          如果s 由许多词组成,则有更高效但也更复杂的算法。

          【讨论】:

            【解决方案5】:

            在这里使用正则表达式来匹配精确的单词与单词边界\b

             import re
             .....
             for str in list:
             if re.search(r'\b'+wordToLook+'\b', str):
                print str
            

            \b 仅匹配以单词终止符开头的单词,例如空格或换行符

            或做这样的事情来避免一次又一次地输入单词进行搜索。

            import re
            list = ['Hi, hello', 'hi mr 12345', 'welcome sir']
            listOfWords = ['hello', 'Mr', '123']
            reg = re.compile(r'(?i)\b(?:%s)\b' % '|'.join(listOfWords))
            for str in list:
               if reg.search(str):
                  print str
            

            (?i) 是不考虑单词大小写的搜索,如果要区分大小写搜索就去掉。

            【讨论】:

              猜你喜欢
              • 2011-08-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-19
              • 1970-01-01
              相关资源
              最近更新 更多