точное и нечувствительное к регистру совпадение для многословного токена в строковом питоне - PullRequest
0 голосов
/ 20 марта 2019

У меня есть список, который содержит и токен из одного и нескольких слов.

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)

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Изменить это :

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 : но мой входной тайл является строкой заголовка. например, «Tata Computer SERVICES получила прибыль в размере х долларов». В таком случае, как мы можем найти строку?

В таком случае я бы предпочел разбить строку перед передачей в функцию:

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)
0 голосов
/ 20 марта 2019

Вы никогда не сможете найти два слова из-за этого кода:

title.lower().split(' ')

Скажите, что ваш заголовок tata computer services , когда вы выполняете этот код, выdup с:

["tata", "computer", "services"]

Тогда в вашем for loop вы будете искать только каждое отдельное слово, по сути, вы разбили заголовок на что-то, что вы не можете найти.

Запись для цикла в человеческих словах:

any(one_word.lower() in title.lower().split(' ') for one_word in brand_list)

Если любое из слов в brand_list можно найти в массиве ["tata",«компьютер», «услуги»], тогда это правда.

Как видите, слова из brand_list не могут совпадать, поскольку слово на самом деле состоит из трех слов ипробелы "Тата компьютерные услуги".

Чтобы выполнить то, что вы ищете:

Измените это:

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 computer servicesss .Чтобы избежать этого, я предлагаю регулярные выражения, такие как:

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):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...