我试图利用正则表达式捕获组从列中删除某些特定文本。我注意到的一件事是,如果捕获组不存在,它会抓住所有东西。
这是我用来创建带有解析文本的新列的代码(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
目标是尽可能地将油箱体积大小从列表中拉出来。所以有几个问题:
这是执行此任务的最佳R功能吗?在安装软件包之前,我首先尝试保留在基本功能中。
如果文本中不存在2位数字,则正则表达式似乎会拉入整个文本。我喜欢#34;惊人的六角形鱼缸。&#34;是NA。
如果容易修复,还有其他一些问题,但主要问题是上面的问题。
我真的很感激帮助!我喜欢在R中的正则表达式上做得更好,但显然对我来说这是一个缓慢而愚蠢的过程。
答案 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"