Список поиска: соответствует только точное слово / строка - PullRequest
2 голосов
/ 02 августа 2011

Как найти точную строку / слово при поиске в списке.Я пытался, но это не правильно.ниже я дал sample list, my code и test results

list = ['Hi, hello', 'hi mr 12345', 'welcome sir']

мой код:

for str in list:
  if s in str:
    print str

результаты теста:

s = "hello" ~ expected output: 'Hi, hello' ~ output I get: 'Hi, hello'
s = "123" ~ expected output: *nothing* ~ output I get: 'hi mr 12345'
s = "12345" ~ expected output: 'hi mr 12345' ~ output I get: 'hi mr 12345'
s = "come" ~ expected output: *nothing* ~ output I get: 'welcome sir'
s = "welcome" ~ expected output: 'welcome sir' ~ output I get: 'welcome sir'
s = "welcome sir" ~ expected output: 'welcome sir' ~ output I get: 'welcome sir'

Мой список содержит более 200 тыс. Строк

Ответы [ 5 ]

1 голос
/ 02 августа 2011
>>> 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']
1 голос
/ 02 августа 2011

Похоже, вам нужно выполнить этот поиск не только один раз, поэтому я бы порекомендовал преобразовать ваш список в словарь:

>>> 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']

p.s. вероятно, вам нужно улучшить item.split() для обработки запятых, точек и других разделителей. возможно используйте регулярные выражения и \w.

p.p.s. как упоминалось в cularion, это не будет соответствовать "добро пожаловать, сэр". если вы хотите сопоставить всю строку, это всего лишь одна дополнительная строка к предлагаемому решению. но если вам нужно сопоставить часть строки, ограниченную пробелами и пунктуацией, regex должен быть вашим выбором.

0 голосов
/ 02 августа 2011

используйте здесь регулярное выражение, чтобы сопоставить точное слово с границей слова \ 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) - это поиск, не беспокоясь о регистре слов, если вы хотите искать с чувствительностью к регистру, тоудали это.

0 голосов
/ 02 августа 2011

Если 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 состоит из многих слов, существует более эффективный, но и гораздо более сложный алгоритм для этого..

0 голосов
/ 02 августа 2011

, если вы ищете точное совпадение:

for str in list:
  if set (s.split()) & set(str.split()):
    print str
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...