Список поиска: соответствует только точному слову/строке

Как сопоставить точную строку/слово при поиске в списке. Я пробовал, но это не правильно. ниже я дал 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 тысяч строк


person Maggie    schedule 02.08.2011    source источник


Ответы (4)


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

>>> 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 должны быть вашим выбором.

person Roman Bodnarchuk    schedule 02.08.2011

если вы ищете точное соответствие:

for str in list:
  if set (s.split()) & set(str.split()):
    print str
person fransua    schedule 02.08.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 состоит из многих слов, для этого есть более эффективный, но и гораздо более сложный алгоритм.

person Sven Marnach    schedule 02.08.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) означает поиск без учета регистра слов. Если вы хотите выполнять поиск с учетом регистра, удалите его.

person Aamir Adnan    schedule 02.08.2011