我有一个包含单个和多个单词标记的列表。
brand_list = ['ibm','microsoft','abby softwate', 'tata computer services']
我需要搜索标题字符串中出现的任何单词。我能找到一个单词。但对于多字令牌,我的代码失败了。这是我的代码。请帮帮我。这是我的解决方案。
import string
def check_firm(test_title):
translator = str.maketrans('', '', string.punctuation)
title = test_title.translate(translator)
if any(one_word.lower() in title.lower().split(' ') for one_word in brand_list):
status_code_value = 0
print("OEM word found")
else:
status_code_value = 1
print("OEM word not found")
print("current value of status code ------------>", status_code_value)
改变这个:
if any(one_word.lower() in title.lower().split(' ') for one_word in brand_list):
对此:
if title.lower() in brand_list:
因此:
import string
brand_list = ['ibm','Microsoft','abby softwate', 'TATA computer services']
brand_list = [x.lower() for x in brand_list] # ['ibm', 'microsoft', 'abby softwate',
# 'tata computer services']
def check_firm(test_title):
translator = str.maketrans('', '', string.punctuation)
title = test_title.translate(translator)
if title.lower() in brand_list:
status_code_value = 0
print("OEM word found")
else:
status_code_value = 1
print("OEM word not found")
print("current value of status code ------------>", status_code_value)
check_firm('iBM')
check_firm('Tata Computer SERVICES')
check_firm('Khan trading Co.')
OUTPUT:
OEM word found
current value of status code ------------> 0
OEM word found
current value of status code ------------> 0
OEM word not found
current value of status code ------------> 1
注意:我使用以下命令将列表中的所有元素转换为
lower()
:
brand_list = [x.lower() for x in brand_list]
这将确保正确进行比较。
编辑:
OP:但我的输入磁贴是标题字符串。例如“塔塔计算机服务公司的利润为x美元”。在那种情况下,我们如何找到字符串?
在这种情况下,我会选择在传递给函数之前拆分字符串:
inp_st1 = 'iBM'
inp_st2 = 'Tata Computer SERVICES made a profit of x dollars'
inp_st3 = 'Khan trading Co.'
check_firm(inp_st1)
check_firm(" ".join(inp_st2.split()[:3])) # Tata Computer SERVICES
check_firm(inp_st3)
由于此代码,您永远无法找到两个单词:
title.lower().split(' ')
假设您的标题是tata计算机服务,当您执行该代码时,您将使用以下代码:
["tata", "computer", "services"]
然后在你的for循环中,你只会搜索每个单数字,基本上你已经把标题分成了一些你无法比拟的东西。
用人类的话写出for循环:
any(one_word.lower() in title.lower().split(' ') for one_word in brand_list)
如果brand_list中的任何单词都可以在数组[“tata”,“computer”,“services”]中找到,那就是真的。
正如您所看到的,brand_list中没有任何单词可以匹配,因为该单词实际上由三个单词和空格“tata计算机服务”组成。
执行您正在寻找的内容:
改变这个:
if any(one_word.lower() in title.lower().split(' ') for one_word in brand_list):
至:
if any(one_word.lower() in title.lower() for one_word in brand_list):
这样你就可以在标题中找到brand_list中的每个单词。您的代码如下所示:
brand_list = ['ibm','microsoft','abby softwate', 'tata computer services']
import string
def check_firm(test_title):
translator = str.maketrans('', '', string.punctuation)
title = test_title.translate(translator)
if any(one_word.lower() in title.lower() for one_word in brand_list):
status_code_value = 0
print("OEM word found")
else:
status_code_value = 1
print("OEM word not found")
print("current value of status code ------------>", status_code_value)
check_firm("ibm")
check_firm("abby software")
check_firm("abby softwate apple")
使用以下输出:
OEM word found
current value of status code ------------> 0
OEM word not found
current value of status code ------------> 1
OEM word found
current value of status code ------------> 0
编辑
OP:我试过你的解决方案。问题是它也适用于像“tata computer servicessssssssss”这样的输入。有任何想法克服这个问题。谢谢
在评论中突出显示,此代码将传递一个像tat计算机服务的标题。为了避免这种情况,我建议使用正则表达式,这样:
brand_list = ['ibm','microsoft','abby softwate', 'tata computer services']
import string
import re
def check_firm(test_title):
translator = str.maketrans('', '', string.punctuation)
title = test_title.translate(translator)
if any(re.search(r'\b' + one_word.lower() + r'\b', title) for one_word in brand_list):
status_code_value = 0
print("OEM word found")
else:
status_code_value = 1
print("OEM word not found")
print("current value of status code ------------>", status_code_value)
check_firm("tata computer services")
check_firm("tata computer servicessssss")
check_firm("tata computer services something else")
产量
OEM word found
current value of status code ------------> 0
OEM word not found
current value of status code ------------> 1
OEM word found
current value of status code ------------> 0
感兴趣的部分是:
any(re.search(r'\b' + one_word.lower() + r'\b', title) for one_word in brand_list):