当捕获组不存在时,正则表达式会抓取所有内容

时间:2015-04-09 14:27:29

标签: regex r data.table

我试图利用正则表达式捕获组从列中删除某些特定文本。我注意到的一件事是,如果捕获组不存在,它会抓住所有东西。

这是我用来创建带有解析文本的新列的代码(R中的data.table语法):

regexp <- "(?:.*)([0-9]{2,3})(\\s?[Gg]?[Aa]?[Ll]?[Ll]?[Oo]?[Nn]?)(?:.*)"
data <- data[, Volume := gsub(regexp, "\\1\\2", Title)]

数据如下:

Nice 55 g fish tank with stand  
45 Gallon Aquarium fish tank and Stand  
Amazing Hexagonal Fish Tank.  
92gallon fish tank  
Fish Tank & Stand $30 obo  
2007 PROLINE 29' GRAND SPORT CENTER CONSOLE
110 gallon tall fish tank  
20 and 10 Gallon Aquarium / Fish Tanks  

结果如下:

55 g                            <- fine  
45 Gallon                       <- fine  
Amazing Hexagonal Fish Tank.    <- not good.  how to replace with NA?  
92gallon                        <- fine  
30 o                            <- wrongly identified  
29                              <- wrongly identified 
10 gallon                       <- I thought [0-9]{2,3} would grab 2 or 3 digits?  
10 gallon                       <- only 1 of 2 tank sizes identified

目标是尽可能地将油箱体积大小从列表中拉出来。所以有几个问题:

  1. 这是执行此任务的最佳R功能吗?在安装软件包之前,我首先尝试保留在基本功能中。

  2. 如果文本中不存在2位数字,则正则表达式似乎会拉入整个文本。我喜欢#34;惊人的六角形鱼缸。&#34;是NA。

  3. 如果容易修复,还有其他一些问题,但主要问题是上面的问题。

  4. 我真的很感激帮助!我喜欢在R中的正则表达式上做得更好,但显然对我来说这是一个缓慢而愚蠢的过程。

1 个答案:

答案 0 :(得分:1)

我不确定您期望的确切输出,但这是我的尝试:

x <- c('Nice 55 g fish tank with stand', 
       '45 Gallon Aquarium fish tank and Stand',
       'Amazing Hexagonal Fish Tank.', 
       '92gallon fish tank', 'Fish Tank & Stand $30 obo',
       "2007 PROLINE 29' GRAND SPORT CENTER CONSOLE", 
       '110 gallon tall fish tank',
       '20 and 10 Gallon Aquarium / Fish Tanks')

r <- regmatches(x, gregexpr('\\d{2,3}[^\n]*(?i:g\\b|gallon)', x, perl=TRUE))
unlist({r[sapply(r, length)==0] <- NA; r})

# [1] "55 g"             "45 Gallon"        NA                 "92gallon"        
# [5] NA                 NA                 "110 gallon"       "20 and 10 Gallon"