2016-09-20 52 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

相关问题