【问题标题】:openrefine extracting a number from a text column using regexopenrefine 使用正则表达式从文本列中提取数字
【发布时间】:2016-02-09 21:45:54
【问题描述】:

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

【问题讨论】:

  • 我认为您正在寻找/[-+]?[0-9]+(?:\.[0-9]+)?(?=\s*g)/g。如果您还需要匹配OZ 之前的数字,请使用/[-+]?[0-9]+(?:\.[0-9]+)?(?=\s*(?:g|OZ)\b)/ig - 根据需要展开
  • 请提供您想要的输出结果。谢谢
  • 对不起,我应该更清楚。取上面的前四行,我希望结果返回数字:113.5、20、227、15 等。一旦我得到解析的值,我想我可以使用“toNumber”命令将它转换为数字。对于那些没有任何以克为单位的行(例如 20 液量盎司),我将忽略这些值 - 返回 null 是可以的。
  • 我确实尝试了 Wiktor 的建议,但它似乎不起作用。我去看看能不能加个截图来展示一下结果。

标签: regex openrefine


【解决方案1】:

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

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

例如,您可以尝试:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多