Выражение регулярного выражения, чтобы найти размер бутылки разбора из строки (например, 750 мл) - PullRequest
2 голосов
/ 19 сентября 2019

У меня есть длинный список строк, которые представляют собой разные продукты в моей базе данных, каждая с этикеткой продукта и размерами продукта (включая размер упаковки) продукта.Я хотел бы разделить строки на две подстроки: первая часть до размера и вторая часть, которая содержит размер жидкости и, возможно, размер упаковки.Например, у меня есть следующие строки:

str1 = 'PRODUCTA 1909 SUPERIOR GIN 89 PROOF 750ML' 

str2 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 2PK' 

str3 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 6PK' 

str4 = 'PRODUCTC FLAV GIN 70 PROOF VAP 50ML 5PK' 

Я хотел бы получить следующее:

str1a = 'PRODUCTA 1909 SUPERIOR GIN 89 PROOF' 
str1b = '750ML'

str2a = 'PRODUCTB FLAV GIN 70 PROOF VAP'
str2b = '1.5L 2PK' 

str2a = 'PRODUCTB FLAV GIN 70 PROOF VAP'
str2b = '1.5L 6PK' 

str4a = 'PRODUCTC FLAV GIN 70 PROOF VAP' 
str4b = '50ML 5PK' 

Сложность заключается в том, что многие продукты имеют цифры на этикетке продукта (например, 1909 в строке1) и что некоторые размеры продукта составляют не только количество литров (1,5 л, 750 мл и т. д.), но и размер упаковки, в которой он поставляется (2 упаковки, 6 упаковок и т. д.).

Я хотел бы разбить каждую цифру перед буквой «L» и игнорировать точки.Тогда к ML, CL или L относились бы одинаково, а 1,5 л все равно следует было бы определить как 1,5 л, а не 15 л.

Может ли кто-нибудь помочь мне с правильными выражениями регулярных выражений сделать это?

1 Ответ

5 голосов
/ 19 сентября 2019

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

PS: Спасибо @Toto за его комментарий о каналах

import re


def get_volume(text):
    # You can add all the list of volume fractions
    _volume = re.search(r'(\d+(\.\d+)?[MCDNPF]?L(\s+\d+PK)?)', text)
    if _volume:
        volume = _volume.groups()[0]
        return text.replace(volume, '').strip(), volume
    return text, None


str1 = 'PRODUCTA 1909 SUPERIOR GIN 89 PROOF 750ML'
str2 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 2PK'
str3 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 6PK'
str4 = 'PRODUCTC FLAV GIN 70 PROOF VAP 50ML 5PK'

texts = [str1, str2, str3, str4]

for elm in texts:
    print(get_volume(elm))

Вывод:

('PRODUCTA 1909 SUPERIOR GIN 89 PROOF ', '750ML')
('RODUCTB FLAV GIN 70 PROOF VA', '1.5L 2PK')
('RODUCTB FLAV GIN 70 PROOF VA', '1.5L 6PK')
('RODUCTC FLAV GIN 70 PROOF VA', '50ML 5PK')

Обновление:

Если вам нужно обработать случай .5ML, используйте этот шаблон:

r'((\d+(\.\d+)?|(\.\d+))[MCDNPF]?L(\s+\d+PK)?)'

Так, например:

str1 = 'PRODUCTA 1909 SUPERIOR GIN 89 PROOF 750ML'
str2 = 'PRODUCTB FLAV GIN 70 PROOF VAP .5L 2PK'
str3 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 6PK'

Вернется:

('PRODUCTA 1909 SUPERIOR GIN 89 PROOF ', '750ML')
('RODUCTB FLAV GIN 70 PROOF VA', '.5L 2PK')
('RODUCTB FLAV GIN 70 PROOF VA', '1.5L 6PK')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...