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

how to get the weight and quantity from strings in a list in Python?

我是 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']

有什么办法可以得到这个吗?

你的任务很复杂,Whosebug 不是一个代码我的东西网站,但也许这种方法可以让你稍微适应一下:

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 来解决。

最好把前面的数量归一化:

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