ls()中的模式参数可以反转吗?

时间:2014-09-23 03:00:18

标签: regex r

我正在尝试获取基础包中所有函数名称的向量,其中只包含.作为标点符号,或者根本没有标点符号。我只想使用ls()函数。

ls()采用定义为

pattern参数
  

可选的正则表达式。仅返回匹配模式的名称。 glob2rx可用于将通配符模式转换为正则表达式。

我正试图反转我的正则表达式。但我也希望保留包含.的函数。这是我不想要的一些例子。

lsBase1 <- ls("package:base", pattern = "[[:punct:]]")
head(lsBase1)
# [1] "^"   "~"   "<"   "<<-" "<="  "<-" 

我想要这个的反转版本,好像我在invert = TRUE中使用grep,或者执行以下操作。 但是我还想要包含.的函数,如果它们包含标点符号。

lsBase2 <- ls("package:base")
lsBase2 <- lsBase[!grepl("[[:punct:]]", lsBase)]
head(lsBase2)
# [1] "abbreviate"      "abs"             "acos"            "acosh"          
# [5] "addNA"           "addTaskCallback"

有没有办法反转pattern中的ls()参数?或者,更一般地,我可以反转正则表达式[[:punct:]],以便它返回相反的,但包括那些仅包含.作为标点符号的匹配项?

注意:不止一个.没问题。

我想要的另一个例子是:是的我想要is.vector但是我不想要[.data.frame

3 个答案:

答案 0 :(得分:5)

我相信这就是你要找的东西:

m <- ls("package:base", pattern="^(\\.|[^[:punct:]])*$")

|是&#34; OR&#34;的正则表达式,所以在单词中,它表示类似于#34;匹配从字符串的开头到结尾的字符序列,每个都是.,或者不是标点符号&#34;。


确认这是有效的:

## Dissolve the matched strings and check for any verboten characters.  
sort(unique(unlist(strsplit(m, ""))))
#  [1] "." "0" "1" "2" "3" "4" "8" "a" "A" "b" "B" "c" "C" "d" "D" "e"
# [17] "E" "f" "F" "g" "G" "h" "H" "i" "I" "j" "J" "k" "K" "l" "L" "m"
# [33] "M" "n" "N" "o" "O" "p" "P" "q" "Q" "r" "R" "s" "S" "t" "T" "u"
# [49] "U" "v" "V" "w" "W" "x" "X" "y" "Y" "z"

## Have a look at (at least a few of) the names _excluded_ by the regex:
n <- setdiff(ls("package:base"), m)
sample(n, 10)
# [1] "names<-.POSIXlt" "[[<-.data.frame" "!.hexmode"       "$<-"            
# [5] "<-"              "&&"              "%*%"             "package_version"
# [9] "$"               "regmatches<-"   

答案 1 :(得分:3)

以下内容适用于您所要求的内容。

> lsBase2[grepl('^([^\\pP\\pS]|\\.)+$', lsBase2, perl=T)]

编辑:或者您可以简单地使用以下(R版本3.1.1)返回1029结果:

> ls("package:base", pattern="^[a-zA-Z0-9.]+$")

答案 2 :(得分:0)

如果您分步考虑,这很容易。首先删除.个字符,然后扫描其他标点符号:

lsBase2[!grepl('[[:punct:]]', gsub('[.]', '', lsBase2))]