Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 正则表达式从感兴趣的单词中提取一个由字符串分隔的数字及其度量单位_R_Regex_String_Text Mining - Fatal编程技术网

R 正则表达式从感兴趣的单词中提取一个由字符串分隔的数字及其度量单位

R 正则表达式从感兴趣的单词中提取一个由字符串分隔的数字及其度量单位,r,regex,string,text-mining,R,Regex,String,Text Mining,我正在学习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") 我认为这最好用正则表达式来完成,但我对它还很陌生,所以我有些挣扎 使用str_match,我可以获得特定单元前面的数字,如下所示:

我正在学习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")
我认为这最好用正则表达式来完成,但我对它还很陌生,所以我有些挣扎

使用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等,并要求匹配其中任何一个单位,以便在本例中克匹配但不匹配

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


谢谢你的帮助

一种选择是检测字符串中的“butter”,然后使用stru-extract

或者使用str_detect和str_extract


您可能想看看类似于[\d.]+\s[a-zA-Z]+.*黄油的东西

\\s+匹配任意数量的空格,\\s+匹配任意数量的非空格。^从头开始


text[greplbutter,text]仅返回包含单词butter的文本元素。也许将参数ignore.case=TRUE添加到grepl中,使其也匹配Butter…

基本的R解决方案是将Butter行变灰,然后使用read.table解析它们,因为匹配的项始终是前两个字段。没有使用包,唯一使用的正则表达式是简单表达式

如果需要在单独的列中显示数字和度量单位,请尝试。
str_match(text, "\\s*(\\d+)\\s*Tb")
     [,1]   [,2]
[1,] "5 Tb" "5" 
[2,] NA     NA  
[3,] NA     NA  
[4,] "3 Tb" "3" 
str_extract(grep("butter", text, value = TRUE), "[0-9.]+\\s+\\w+")
#[1] "0.5 Tb"  "3 grams" "2 tbs"
library(tidyverse)
str_detect(text, "butter") %>% 
    extract(text, .) %>%
    str_extract("[0-9.]+\\s+\\w+")
#[1] "0.5 Tb"  "3 grams" "2 tbs"    
sub("^(\\S+\\s+\\S+).*", "\\1", text[grepl("butter", text)])
[1] "0.5 Tb"  "3 grams" "2 tbs"
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