正则表达式提取一个数字及其度量单位,由一个字符串与一个感兴趣的单词分隔开来

问题描述 投票:-1回答:4

我正在学习R,我正在尝试使用正则表达式来提取特定文本。我想从特定成分的配方中捕获一个数字和度量单位。

例如,对于以下文本:

text <-  c("0.5 Tb of butter","3 grams (0.75 sticks) of chilled butter","2 tbs softened butter", "0.3 Tb of milk")

我想提取与黄油有关的数字和单位,即:

0.5 Tb
3 grams
2 tbs

我认为这最好用正则表达式来完成,但我对此很新,所以我有点挣扎。

使用str_match我可以得到特定单位前面的数字,如下所示:

str_match(text, "\\s*(\\d+)\\s*Tb")
     [,1]   [,2]
[1,] "5 Tb" "5" 
[2,] NA     NA  
[3,] NA     NA  
[4,] "3 Tb" "3" 

但是我怎么才能得到与黄油和一系列单位相关的值。是否有可能列出可能的单位(即克,tbs,Tb等)并要求匹配其中任何一个(因此在这个例子中克会匹配而不是棍子)?

或者这可能会通过一些循环更好地完成?我可以把每个句子放到一个数据框中,遍历每一行,询问行中是否有“黄油”,在其中搜索一个数字并提取后面的数字和单词,这应该是度量单位。

谢谢您的帮助。

r regex string text-mining
4个回答
1
投票

一个基本的R解决方案是grep出黄油线,然后使用read.table来解析它们,因为匹配的项目总是前两个字段。没有使用包,唯一使用的正则表达式是简单表达式butter

butter <- grep("butter", text, value = TRUE)
read.table(text = butter, fill = TRUE, as.is = TRUE)[1:2]

赠送:

   V1    V2
1 0.5    Tb
2 3.0 grams
3 2.0   tbs

0
投票

一个选项是检测字符串中的'黄油',然后使用str_extract

str_extract(grep("butter", text, value = TRUE), "[0-9.]+\\s+\\w+")
#[1] "0.5 Tb"  "3 grams" "2 tbs"

或者使用str_detectstr_extract

library(tidyverse)
str_detect(text, "butter") %>% 
    extract(text, .) %>%
    str_extract("[0-9.]+\\s+\\w+")
#[1] "0.5 Tb"  "3 grams" "2 tbs"    

0
投票

你可能想看看像这样的([\d.]+)\s([a-zA-Z]+).*butter


0
投票
sub("^(\\S+\\s+\\S+).*", "\\1", text[grepl("butter", text)])
[1] "0.5 Tb"  "3 grams" "2 tbs"

\\s+匹配任意数量的空格和\\S+以匹配任意数量的非空格。 ^从一开始就开始了。

text[grepl("butter", text)]只返回包含单词butter的文本元素。 Perhaphs将参数ignore.case = TRUE添加到grepl(),因为它也匹配Butter ...

© www.soinside.com 2019 - 2024. All rights reserved.