2016-12-30 8 views
-1

У меня есть набор словКак выполнить точное совпадение строк на питона

слова = { «спасибо давая», «кошка», «вместо», и т.д. ...}

мне нужно искать именно эти слова в таблице столбце «описание»

--------------------------------| 
ID | Description    | 
--- |---------------------------| 
1 | having fun thanks giving| 
----|---------------------------| 
2 | cat eats all the food | 
----|---------------------------| 
3 | instead you can come  | 
-------------------------------- 

def matched_words(x,words): 
    match_words =[] 
    for word in words: 
    if word in x: 
     match_words.append(word) 
    return match_words 

df['new_col'] = df['description'].apply(lambda x:matched_words(x,words)) 

желаемый результат: только

----|---------------------------|-------------------| 
ID | Description    |matched words  | 
--- |---------------------------|-------------------| 
1 | having fun thanks giving|['thanks giving'] | 
----|---------------------------|------------------ | 
2 | cat eats all the food |['cat']   | 
----|---------------------------|-------------------| 
3 | instead you can come  | []    | 
---------------------------------------------------- 

я получаю матчи грех GLE лексемы, как [ «кошка»]

+0

Вы уверены, что имеете словарь? Вы уверены, что это выглядит так? – Dekel

+0

Словарь выглядит как '{ключ: значение, ключ: значение и т. Д.}'. В вашем словаре есть значения, нет ключей. Это больше похоже на список. – Barmar

+1

Я думаю, он имел в виду набор вместо словаря. –

ответ

1

Следующий код должен дать вам результаты, которые вы ищете:

import re 

words = {'thanks', 'cat', 'instead of'} 
phrases = [ 
    [1,"having fun at thanksgiving"], 
    [2,"cater the food"], 
    [3, "instead you can come"], 
    [4, "instead of pizza"], 
    [5, "thanks for all the fish"] 
] 

matched_words = [] 
matched_pairs = [] 
for word in words: 
    for phrase in phrases: 
     result = re.search(r'\b'+word+'\W', phrase[1]) 
     if result: 
      matched_words.append(result.group(0)) 
      matched_pairs.append([result.group(0), phrase]) 
      print() 

print(matched_words) 
print(matched_pairs) 

Соответствующая часть, то есть, regex немного re.search(r'\b'+word+'\W', phrase[1]), ищет случаев которая найдена нашей поисковой строкой, начинающейся с границы слова \b, или empty string, и заканчивается символом не-слова \W. Это должно гарантировать, что мы найдем только целые строки. Не нужно ничего делать с текстом, который вы хотите найти.

Конечно, вы можете использовать все, что вы хотите вместо words, phrases, matched_words и matched_pairs.

Надеюсь, это поможет!

+0

Я получаю выход как лифт, он работает для сопоставления строки – Hari

+0

list * в предыдущем комментарии. Я пытаюсь получить вывод в качестве другого столбца в таблице как 1, «повеселиться при благодарении», [] 2, «cater пища », [] 3,« вместо этого вы можете прийти », [] 4« вместо пиццы », ['вместо'] 5« спасибо за всех рыб », ['thanks']. Если он соответствует более чем одному, он будет в списке как ['thanks', 'cat']. Невозможно получить этот результат – Hari

+0

В вашем вопросе конкретно говорится «слово в словах: если слово в x: напечатать слово», а затем дальше, чтобы предположить, что то, что вы просите, - это способ получить точные соответствия. Измените свой вопрос, чтобы было ясно, что вы спрашиваете, как получить вывод в списке. Я обновил свой ответ, чтобы отразить то, что, как я думаю, вы просите. Это верно? Кроме того, в будущем старайтесь быть максимально конкретными по своему желаемому результату. Оба они делают более полезным ответить и для будущих людей найти помощь, в которой они нуждаются, когда найдут этот Вопрос. –

0
import re 
words = {'thanks', 'cat', 'instead of'} 

samples = [ 
    (1, 'having fun at thanksgiving'), 
    (2, 'cater the food'), 
    (3, 'instead you can come'), 
    (4, 'instead of you can come'), 
] 

for id, description in samples: 
    for word in words: 
     if re.search(r'\b' + word + r'\b', description): 
      print("'%s' in '%s" % (word, description))