grep在字符串的开头是固定= T在R?

时间:2010-12-18 10:20:02

标签: regex r grep

如何使用fixed=T进行grep,但只在字符串的开头?

grep("a.", c("a.b", "cac", "sss", "ca.f"), fixed = T)
# 1 4

我想第一次出现。 [编辑:要匹配的字符串事先不知道,可以是任何东西。 “一个。”仅仅是为了举例]

感谢。

[编辑:我现在解决了这个问题,但其他任何想法都非常受欢迎。我会接受任何替代解决方案作为答案。

s <- "a."
res <- grep(s, c("a.b", "cac", "sss", "ca.f"), fixed = T, value = T)
res[substring(res, 1, nchar(s)) == s]

5 个答案:

答案 0 :(得分:9)

如果你想在字符串的开头匹配一个确切的字符串(字符串1)(字符串2),那么只需将字符串2的子集与字符串1的长度相同并使用==,就应该相当快。

答案 1 :(得分:3)

实际上,格雷格 - 你 - 已经提到了最干净的解决方案。我甚至会放弃grep:

> name <- "a#"
> string <- c("a#b", "cac", "sss", "ca#f")
> string[substring(string, 1, nchar(name)) == name]
[1] "a#b"

但如果你真的坚持使用grep,你可以使用Dwins方法,或者遵循令人难以置信的解决方案:

specialgrep <- function(x,y,...){
  grep(
    paste("^",
          gsub("([].^+?|[#\\-])","\\\\\\1",x)
          ,sep=""),
    y,...)
}
> specialgrep(name,string,value=T)
[1] "a#b"

我可能忘了在gsub中包含一些字符。确保你首先保留]符号,然后在字符集中保留 - 最后一个,否则你会收到错误。或者忘掉它,使用自己的解决方案。这个只是为了好玩的缘故: - )

答案 2 :(得分:2)

由于模式中的fixed=T,您是否要使用.?在这种情况下,你可以逃避.这将起作用:

grep("^a\\.", c("a.b", "cac", "sss", "ca.f"))

答案 3 :(得分:1)

如果您只想关注前两个字符,那么只向grep提供那么多信息:

> grep("a.", substr(c("a.b", "cac", "sss", "ca.f"), 1,2) ,fixed=TRUE)
[1] 1

你可以轻松地将它包装成一个函数:

> checktwo <- function (patt,vec) { grep(patt, substr(vec, 1,nchar(patt)) ,fixed=TRUE) }
> checktwo("a.", c("a.b", "cac", "sss", "ca.f") )
[1] 1

答案 4 :(得分:1)

我认为G博士在答案中有解决方案的关键,但没有明确地说出来:模式中的“^”指定“在字符串的开头”。 (“$”表示字符串末尾)

所以他的“^ a。” pattern意味着“在字符串的开头,查找'a'后跟任何一个字符[''']”。

或者您可以使用“^ a”作为模式,除非您不想匹配仅包含“a”的一个字符串。

这有帮助吗?

杰弗里