首页 > 解决方案 > 正则表达式从字符串中查找解析瓶大小(例如 750ML)

问题描述

我的数据库中有一长串不同产品的字符串,每个字符串都有产品标签和产品尺寸(包括包装尺寸)。我想将字符串分成两个子字符串:第一部分直到大小,第二部分包含液体的大小,可能还有包装的大小。例如,我有以下字符串:

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' 

这里的难点是很多产品的产品标签上都有数字(比如string1中的1909),而且有些产品的尺寸不仅是升的数量(1.5L、750ML等),还有它自带的包装尺寸在(2pack、6pack 等)中。

我想拆分字母 'L' 之前的每个数字,并忽略点。然后,ML 或 CL 或 L 将被同等对待,1.5L 仍应被捕获为 1.5L 而不是 15L。

有人可以帮助我使用正确的正则表达式吗?

标签: pythonregexstringsplit

解决方案


这是一个正则表达式模式和一个如何完成任务的示例:

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')

推荐阅读