我正在学习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解决方案是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
一个选项是检测字符串中的'黄油',然后使用str_extract
str_extract(grep("butter", text, value = TRUE), "[0-9.]+\\s+\\w+")
#[1] "0.5 Tb" "3 grams" "2 tbs"
或者使用str_detect
和str_extract
library(tidyverse)
str_detect(text, "butter") %>%
extract(text, .) %>%
str_extract("[0-9.]+\\s+\\w+")
#[1] "0.5 Tb" "3 grams" "2 tbs"
你可能想看看像这样的([\d.]+)\s([a-zA-Z]+).*butter
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
...