1

我正在尝试从通过 Kaggle 找到的 OpenFoodFacts 数据集中解析出一列数据。有一个名为“serving_size”的属性,它包含包装上显示的食品的任何份量信息。大多数情况下,份量以克 (g) 表示,但通常也有其他文本。我希望能够搜索字符串,找到与克数对应的数字,并将该值提取到自己的字段中。该值不仅仅是一个整数 - 它可能有一个小数。

我是正则表达式的新手,但似乎应该可以搜索“g”字符,并且如果它是由任何数值进行的以提取它们。我发现一些食谱表明这是可能的,但到目前为止,我尝试过的任何方法都没有奏效。在 OpenRefine 文档中,他们给出了使用此正则表达式提取十进制数据的示例:/[-+]?[0-9]+(.[0-9]+)?/,但我无法得到任何变化在我们的场景中工作。我也试过像“value.match(/(.)?(/ d+[g]). ?/)”这样的命令。我发现我不明白正则表达式应该如何工作 - 当我告诉它“/d”时,我希望它只会给我返回数值,

任何帮助,将不胜感激。

以下是数据中的一些示例文本字符串:

serving_size  
 - 113.5g
 - 20g
 - 1 cup (227g)
 - 4 cookies (15g)
 - 13 pieces (39g)
 - 1/4 packet (21g) makes 1/2 cup
 - 0.75 oz (21g)
 - 1 can (12 FL OZ) 355g
 - 15.2 fl oz (450g)
 - 1 can (355mL)
 - 1/4 tsp (1.4g)
 - 10 fl oz 1 bottle.
 - 20 fl oz
 - 1 envelope (21g)
 - 1 tbsp (4.5g)
 - 45.2g
 - 1/2 pack 142.5gms
 - 1 carré de chocolat de 20g
 - 4 biscottes (≈ 35g) Ce paquet contient 8.5 portions de 4
   biscottes.
 - 0.33L
 - 2galettes 10.5g
 - 0.041649313g
 - 1 package (79g)

尝试截图

4

1 回答 1

3

在 OpenRefine GREL(用于编写转换的语言)中,“匹配”函数需要正则表达式来匹配单元格中的整个字符串 - 您不能使用部分匹配。

'match' 函数的输出是所有捕获组的数组。要获得特定值,您必须从数组中选择它,或将数组转换为字符串。

因此,例如,您可以尝试:

value.match(/.*?(\d+\.?\d*)g(ram)?(s)?\b?.*/)[0]

这将查找在字母“g”或“gram”或​​“grams”前面有数字(带或不带小数点)后跟非单词字符(例如空格或括号)的所有字符串) 并将该数字捕获为结果捕获组数组的第一个成员。

这 '?' 在第一个 '.*' 之后需要使它变得懒惰,以便捕获组获得整个数字,而不仅仅是最后一个数字。

于 2016-02-09T13:45:54.377 回答