Split String Before массив строк в Python - PullRequest
0 голосов
/ 23 января 2020

Здравствуйте, у меня есть еще одна проблема с разделенной строкой

Сначала это было при разделении на вторую верхнюю букву, как это (спасибо за Омира):

def split_second_upper(string):
    second_upper = False
    for i in range(len(string)):
        if string[i].isupper() and i != 0:
            second_upper = True
        if second_upper:
            return string[0:i], string[i:]

Это было хорошо, прежде чем я получил другую список продуктов, когда их сложнее разделить

какой-то пример продукта:

Veltebøyle Toyota Hi Lux Double Cab 2019 -
Frontbøyle EC Godkjent Super Bar Inox AUDI Q5 2008-2015
Frontbøyle Høy Medium Bar Mark Inox CHEVROLET Captiva 2011 >
Stigtrinn Grand Pedana Inox VOLKSWAGEN Amarok Trend Line 2010 >
Stigtrinn Grand Pedana Inox CITROËN C-Crosser 2008 >
Frontbøyle Polert Standard Toyota Hilux 10-15

Первый продукт в порядке, но другие имеют больше верхних букв

лучший способ Его нижние все буквы перед Список моделей Я могу создать массив с моделью автомобиля (возможно, без первого)

как

Stigtrinn Grand Pedana Inox VOLKSWAGEN Amarok Trend Line 2010 > 

до:

Stigtrinn grand pedana inox VOLKSWAGEN Amarok Trend Line 2010 >

car=['Audi','Bmw','Chevrolet','Citroen','Dacia','Daihatsu','Dodge','Fiat','Ford','Honda','Hyundai','Isuzu','Iveco','Jeep','Kia','Land Rover','Mazda','Mercedes','Mitsubishi','Nissan','Opel','Peugeot','Porsche','Renault','Seat','Skoda','SsangYong','Subaru','Suzuki','Toyota','Volkswagen','Volvo',]

Или, возможно, его можно разбить на l oop перед машиной (из массива)?

разделить как:

 Stigtrinn Grand Pedana Inox 
 VOLKSWAGEN Amarok Trend Line 2010 >

UPADETE:

I CREATE Функция, подобная этой:

def split_car(string):
   car_array=['Audi','Bmw','Chevrolet','Citroen','Dacia','Daihatsu','Dodge','Fiat','Ford','Honda','Hyundai','Isuzu','Iveco','Jeep','Kia','Land Rover','Mazda','Mercedes','Mitsubishi','Nissan','Opel','Peugeot','Porsche','Renault','Seat','Skoda','SsangYong','Subaru','Suzuki','Toyota','Volkswagen','Volvo',]
   for car in car_array:
       if car in string:
           a, b = string.split(" " + car + "", 1)
           b = car + b
           return (a, b)

но теперь мне нужно игнорировать верхнюю и нижнюю буквы от строки автомобиля, иногда Bmw может быть BMW или BMW, как я могу это сделать?

1 Ответ

1 голос
/ 23 января 2020

При таком разнообразном (он же «грязный») ввод лучше не полагаться на другую сторону, которая последовательно использовала бы прописные и строчные буквы. Вот реализация поиска каждого слова в утвержденном списке («белый список») марок автомобилей, игнорируя при этом различия в регистре.

text = [ 'Veltebøyle Toyota Hi Lux Double Cab 2019 -',
    'Frontbøyle EC Godkjent Super Bar Inox AUDI Q5 2008-2015',
    'Frontbøyle Høy Medium Bar Mark Inox CHEVROLET Captiva 2011 >',
    'Stigtrinn Grand Pedana Inox VOLKSWAGEN Amarok Trend Line 2010 >',
    'Stigtrinn Grand Pedana Inox CITROËN C-Crosser 2008 >',
    'Frontbøyle Polert Standard Toyota Hilux 10-15' ]

brands = ['Audi','Bmw','Chevrolet','Citroen','Citroën','Dacia','Daihatsu','Dodge','Fiat',
    'Ford','Honda','Hyundai','Isuzu','Iveco','Jeep','Kia','Land Rover','Mazda','Mercedes',
    'Mitsubishi','Nissan','Opel','Peugeot','Porsche','Renault','Seat','Skoda','SsangYong',
    'Subaru','Suzuki','Toyota','Volkswagen','Volvo']

def split_by_brand (string):
    string = string.split()
    brands_cased = [brand.upper() for brand in brands]
    for index,word in enumerate(string):
        if word.upper() in brands_cased:
            return ' '.join(string[:index]),' '.join(string[index:])

for line in text:
    model,brand = split_by_brand (line)
    print ('model "{}", brand "{}"'.format(model,brand))

Результат:

model "Veltebøyle", brand "Toyota Hi Lux Double Cab 2019 -"
model "Frontbøyle EC Godkjent Super Bar Inox", brand "AUDI Q5 2008-2015"
model "Frontbøyle Høy Medium Bar Mark Inox", brand "CHEVROLET Captiva 2011 >"
model "Stigtrinn Grand Pedana Inox", brand "VOLKSWAGEN Amarok Trend Line 2010 >"
model "Stigtrinn Grand Pedana Inox", brand "CITROËN C-Crosser 2008 >"
model "Frontbøyle Polert Standard", brand "Toyota Hilux 10-15"

Это не отказоустойчивый (и это не так просто). Если, например, бренд отсутствует в списке или просто неправильно написан в исходном тексте, вы получите сообщение об ошибке.
Например, мне пришлось добавить правильно написанное 'Citroën' в исходный список бренды, чтобы он соответствовал тексту.

...