gregexpr R中的函数/循环

时间:2017-05-22 00:52:46

标签: r regex

我有一个看起来如下的凌乱的gregexpr调用(它匹配在下面的单位向量中列出的任何以下单位之前的任何单个或多个数字):

sub_matches <- as.character(regmatches(tolower(data$Dose.taken), 
        gregexpr("[0-9]+[0-9]g|+[0-9]g|[0-9]+[0-9]mg|+[0-9]mg|+[0-9]gm
            |[0-9]+[0-9]gm |[0-9]+[0-9]grm|+[0-9]grm
                |[0-9]+[0-9]ml|+[0-9]ml|[0-9]+[0-9]iu|+[0-9]iu
                    |[0-9]+[0-9]mls|+[0-9]mls|[0-9]+[0-9]gl|+[0-9]gl
                        |[0-9]+[0-9]l|+[0-9]l|[0-9]+[0-9]sheet|+[0-9]sheet
                            |[0-9]+[0-9]mcg|+[0-9]mcg", 
                                tolower(data$Dose.taken))))

我想将它包装在一个函数或循环中,以便循环通过以下单位向量。但是,以下内容不适用于其当前形式。我怎么能整理一下呢?

unit <- c("g","mg","gm","grm","ml","mls","l","mcg","iu","sheet")

i<-1

for(i in 1:length(unit)){

sub_matches <- as.character(regmatches(tolower(data$Dose.taken), 
        gregexpr("[0-9]+[0-9]paste(unit[i])|+[0-9]paste(unit[i])",tolower(data$Dose.taken))))


 }

2 个答案:

答案 0 :(得分:1)

如果你想利用一个字符向量存储单位,我会玩paste0sprintf

regex <- sprintf('\\d+(%s)', paste(unit, collapse='|'))

sub_matches <- 
   regmatches(data$Dose.taken, 
     gregexpr(regex, ignore.case=TRUE, data$Dose.taken))

否则,请简化正则表达式(基于上述语句):

sub_matches <- 
   regmatches(data$Dose.taken, 
     gregexpr('\\d+(gm?|grm|iu|l|mcg|mg|mls?|sheet)', ignore.case=TRUE, data$Dose.taken))

答案 1 :(得分:1)

同意hwnd!我的两便士:

  1. 您的正则表达式[0-9] + [0-9]只能替换为[0-9] +。
  2. 避免循环:paste(paste("[0-9]+",unit,sep=""),collapse="|")给出 "[0-9]+g|[0-9]+mg|[0-9]+gm|[0-9]+grm|[0-9]+ml|[0-9]+mls|[0-9]+l|[0-9]+mcg|[0-9]+iu|[0-9]+sheet" ..然后可以将其与(regmatches,gregexpr)
  3. 一起使用

    免责声明:如果我有这样做的声誉,我会将此作为对hwnd答案的评论。