字符串提取:了解奇怪的输出

时间:2014-03-13 00:54:42

标签: regex r substring gsub

我没有太多使用正则表达式。我一直在编写代码来从R中的列名中提取数字。

列名:

c<- c("Variable182predict", "Variable123Target", "Timestamp", "TargetVariable")

我在R中使用以下函数来提取数字:

numbers<-gsub(pattern=".*e(\\d+).*","\\1", c)

幸运的是,我有数字,但有两个结果我在输出中无法理解:

"182" "123" "Timestamp" "TargetVariable"

我得到了提取数字背后的基本原理,但为什么它会给出最后两个列名称。这是我无法理解的。任何输入都将受到高度赞赏。感谢!!!

4 个答案:

答案 0 :(得分:3)

hrbrmstr和Jake Burkhead给出了解释:未匹配的内容未被替换。

由于最后两列不包含数字,因此不匹配(并替换)。

解决问题的方法是用一无所有的方式替换所有非数字的方法:

numbers<-gsub(pattern="\\D+","", c)

答案 1 :(得分:2)

gsub()将获取向量,查找模式,在找到的位置替换它,并返回每个元素是否被替换。你可以使用这样的东西:

library(stringr)

c.names <- c("Variable182predict", "Variable123Target", "Timestamp", "TargetVariable")
as.numeric(na.omit(str_extract(c.names, "\\d+")))

将返回

## [1] 182 123

(我假设你只想要数字输出而没有别的东西)

stringr是一个非常方便的包,如果你做了大量的字符向量。

答案 2 :(得分:1)

来自?gsub

 Elements of character vectors ‘x’ which are not
 substituted will be returned unchanged

因此,如果正则表达式与其中一个输入元素不匹配,则它对该元素不起任何作用。输入向量的最后两个元素与模式不匹配,因为它们不包含e后跟一个或多个数字,因此它们不会被触及。

答案 3 :(得分:0)

如果要从文本中提取所有数字,请使用stringi包中的此功能。 “Nd”是十进制数字的类。

    stri_extract_all_charclass(c(123,43,"66ala123","kot"),"\\p{Nd}")
[[1]]
[1] "123"

[[2]]
[1] "43"

[[3]]
[1] "66"  "123"

[[4]]
[1] NA

请注意,这里分别提取66和123个数字并使用gsub函数将它们粘贴在66123中