我没有太多使用正则表达式。我一直在编写代码来从R中的列名中提取数字。
列名:
c<- c("Variable182predict", "Variable123Target", "Timestamp", "TargetVariable")
我在R中使用以下函数来提取数字:
numbers<-gsub(pattern=".*e(\\d+).*","\\1", c)
幸运的是,我有数字,但有两个结果我在输出中无法理解:
"182" "123" "Timestamp" "TargetVariable"
我得到了提取数字背后的基本原理,但为什么它会给出最后两个列名称。这是我无法理解的。任何输入都将受到高度赞赏。感谢!!!
答案 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中