2016-09-20 33 views
1

我需要從字符串中的列表中找到確切的單詞。Python從字符串中的列表中搜索確切的單詞?

我試過下面的代碼。在這裏,我從列表中獲得單個單詞的精確匹配,但是如何匹配列表中的兩個單詞。

categories_to_retain = 
['SOLID', 
'GEOMETRIC', 
'FLORAL', 
'BOTANICAL', 
'STRIPES', 
'ABSTRACT', 
'ANIMAL', 
'GRAPHIC PRINT', 
'ORIENTAL', 
'DAMASK', 
'TEXT', 
'CHEVRON', 
'PLAID', 
'PAISLEY', 
'SPORTS'] 

x = " Beautiful Art By Design Studio **graphic print** Creates A **TEXT** Design For This Art Driven Duvet. Printed In Remarkable Detail On A Woven Duvet, This Is An Instant Focal Point Of Any Bedroom. The Fabric Is Woven Of Easy Care Polyester And Backed With A Soft Poly/Cotton Blend Fabric. The Texture In The Fabric Gives Dimension And A Unique Look And Feel To The Duvet." 

x = x.upper() 

print x 

#x = "GRAPHIC" 
#x = "GRAPHIC PRINTS" 


matches = [cat for cat in categories_to_retain if cat in x.split()] 

matches 

Output: 
['TEXT'] 

在這裏你可以看到有一個詞出現在我的名單'圖形打印'。我想從我的字符串中找到這個詞。

另外我需要找到單詞,即使它以複數或過去式存在。例如,條紋,條紋,圖形打印等

感謝, NIRANJAN

+0

「圖形打印」無法​​找到,因爲它被分成「**圖形」和「打印**」,我想。 – rocksteady

+0

使用帶有邊界的正則表達式 –

+0

您需要自己創建一個split()函數,該函數在變量x中定義的那兩個星號內查找單詞。 – rocksteady

回答

-1

這裏使用的是默認的拆分(),這意味着它將在每個空間進行分割分割字符串:會有弦x.split()中的「GRAPHIC」和「PRINT」,但不是「GRAPHIC PRINT」。你可能想用「if cat in x」,我相信這樣會返回你在這種情況下需要的。

這應該工作:

matches = [cat for cat in categories_to_retain if cat in x] 
+0

謝謝。我做了分裂,以獲得完全匹配。如果我喜歡這樣做,它也會匹配我的列表中單詞文本的字樣。 – Niranjanp

-1

您可以使用正則表達式,這也將有助於避免匹配字符和詳細的輸入字的順序就會顯示出來。

import re 
matches = [] 
categories_to_retain = ['SOLID', 
    'GEOMETRIC', 
    'FLORAL', 
    'BOTANICAL', 
    'STRIPES', 
    'ABSTRACT', 
    'ANIMAL', 
    'GRAPHIC PRINT', 
    'ORIENTAL', 
    'DAMASK', 
    'TEXT', 
    'CHEVRON', 
    'PLAID', 
    'PAISLEY', 
    'SPORTS'] 

x = " Beautiful Art By Design Studio **graphic print** Creates A **TEXT** Design For This Art Driven Duvet. Printed In Remarkable Detail On A Woven Duvet, This Is An Instant Focal Point Of Any Bedroom. The Fabric Is Woven Of Easy Care Polyester And Backed With A Soft Poly/Cotton Blend Fabric. The Texture In The Fabric Gives Dimension And A Unique Look And Feel To The Duvet." 

x = x.upper() 

print(x) 

def searchWholeWord(w): 
    return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search 

for cat in categories_to_retain: 
    return_value = searchWholeWord(cat)(x) 
    if return_value: 
     matches.append(cat) 

print(matches) 

輸出:

['GRAPHIC PRINT', 'TEXT'] 
+0

謝謝其實我是這樣做的第一個地方,但這裏的問題是,它也可以給我答案,如果它發現我的字符串列表中的任何單詞,例如,如果它發現像'紋理'這樣的字它將匹配'文本'。 – Niranjanp

+0

@Niranjanp抱歉錯誤的回覆,我更新了使用正則表達式的代碼。 – RejeeshChandran

+0

感謝它爲我工作。 – Niranjanp

1

使用帶有邊界的正則表達式來獲得精確匹配,即使你只有一個字,如果你想忽略任何標點符號你的邏輯是行不通的:

import re 

patts = re.compile("|".join(r"\b{}\b".format(s) for s in categories_to_retain), re.I) 

x = " Beautiful Art By Design Studio **graphic print** Creates A **TEXT** Design For This Art Driven Duvet. Printed In Remarkable Detail On A Woven Duvet, This Is An Instant Focal Point Of Any Bedroom. The Fabric Is Woven Of Easy Care Polyester And Backed With A Soft Poly/Cotton Blend Fabric. The Texture In The Fabric Gives Dimension And A Unique Look And Feel To The Duvet." 

print(patts.findall(x)) 

這將使你:

['graphic print', 'TEXT'] 
+0

謝謝。它爲我工作。還有一個問題,如果列表中的單詞以複數或過去式預設,該如何匹配。例如,如果它包含圖形打印或文本或條紋。 – Niranjanp

+0

將它們添加到您的字詞列表以匹配 –

+0

好的。我們不能做模糊匹配。 – Niranjanp

相關問題