如何从Python列表中的字符串获取重量和数量?

时间:2018-10-05 08:54:03

标签: python regex python-2.x

我是Python的新手,所以我对如何编写正则表达式模式以从以下字符串列表中找到相应的权重和数量感到困惑。

这是我到目前为止所做的。

import re
string1 = [' (Expiry Date: 30 May 2019) 4 x Organic Infant Goat Milk'
               ' Follow-on Formula 3 400g',
           ' (Expiry on 30 May 2019) 4 x Organic Infant Goat Milk'
               ' Follow-on Formula 2 400g ',
           " [ Bellamy's ] Bellamys Organic Step 3 Toddler Milk Drink"
               " 900g x 6 tins Made In Australia  CARTON DEAL EXPIRE"
               " 06/2019 to 2020",
           ' [[1+1]] FRISO (2) 1.8kg+900g',
           " [[Carton Sales]] Bellamy's Organic Follow-On Formula"
               " Step 2 900g x 6tins",
           ' Dumex Mamil Gold Stage 4 Growing Up Kid Milk Formula'
               ' (850g) x 6',
           ' Wyeth S-26 Promise Gold Stage 4 1.6kg X 6 Tins']

m = [re.search('([0-9.]+[kgG]{1,2})', s).group(0) for s in string1] 
print m

我的输出是这样的:

['400g', '400g', '900g', '1.8kg', '900g', '850g', '1.6kg']

但是我想得到这个输出:

['4x400g', '4x400g', '900gx6', '1.8kg+900g', '900gx6', '850gx6', '1.6kgX6']

有没有办法得到这个?

2 个答案:

答案 0 :(得分:0)

您的任务很复杂,而且StackOverflow并不是一个“我的代码”的网站,但是也许这种方法可以使您有所了解:

for s in string1:
  print(re.findall(
    r'((?:[0-9]+\s*[xX]\b)'
    r'|(?:\b[xX]\s*[0-9]+)'
    r'|(?:[0-9.]+\s*(?:g|kg)\b))', s))

这将打印以下输出:

['4 x', '400g']
['4 x', '400g']
['900g', 'x 6']
['1.8kg', '900g']
['900g', 'x 6']
['850g', 'x 6']
['1.6kg', 'X 6']

您仍然需要自己弄清楚某些部分(例如,在输入中1.8kg900g之间有一个+),但这也许可以帮到您。

在这种情况下(例如在编译器中)通常要执行的操作如下:

您编写一个标记器(又名解析器),将输入分割成多个标记(如单词),然后编写一个词法分析器,它使用标记并产生语义实体(如句子)。在这里,我认为令牌将是①权重,②金额(x 3等),③运算符(+)和④垃圾(其他任何东西)。通常在这一点上剥离空白,因此词法分析器仅接收在 空白之间的内容。如果现在词法分析器接收到一系列权重-加-权重,则它应将其组合为一个实体。如果两者之间有垃圾,则应忽略加号(因为您不希望5kg bought at benn's+jerry's or 300g bought on the Internet导致5kg+300g)。

但是仅靠Regexp并不能完成这种合理的方法,我认为单独使用regexp不能解决您的任务。

答案 1 :(得分:0)

最好标准化前面的数量:

m = ['x'.join(i for i in re.search(r'^(?=.*?(?:(\d+)\s*x\b|\bx\s*(\d+)))?(?=.*?((?:\b[0-9]+(?:\.[0-9]+)?(?:kg|g)\b\s*?\+?\s*?)+))', s, flags=re.IGNORECASE).groups() if i) for s in string1]

鉴于您的示例输入,m将变为:

['4x400g', '4x400g', '6x900g', '1.8kg+900g', '6x900g', '6x850g', '6x1.6kg']