openrefine使用正则表达式

时间:2016-02-08 18:36:49

标签: regex openrefine

我正在尝试从我通过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)

screenshot of attempt

1 个答案:

答案 0 :(得分:2)

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

'匹配'的输出function是所有捕获组的数组。要获取特定值,您必须从数组中选择此值,或将数组转换为字符串。

例如,您可以尝试:

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

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

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