grepl 与正则表达式

grepl with regex

我在将 grepl 与正则表达式结合使用时遇到困难。

这是一个小例子:

我有一个字符向量:

text <- c(

  "D_Purpose__Repairs" ,
  "Age" ,
  "F_Job"  
)

我想select以D_或F_开头的单词。所以我写:

grepl("\>D_.+ | \>F_.+", text)

grepl("\D_.+ | \F_.+", text)

grepl("\^D_.+ | \^F_.+", text)

然而这个returns:

[1] FALSE FALSE FALSE

你能帮我理解我做错了什么以及我应该如何更正我的代码吗?

我们将不胜感激您的建议。

您不需要(也不得)使用反斜杠转义插入符号,并且您不能在正则表达式中的 | 周围放置额外的空格。这如您所愿:

> grepl("^D_.+|^F_.+", text)
[1]  TRUE FALSE  TRUE

对您的模式的一些评论:

  • \>D_.+ | \>F_.+ - 此处,\> 匹配单词位置的结尾,而此处的实际位置是单词的 start (因此,您可能想尝试使用 \<'). Also, the spaces around|are meaningful, you should not add them unless you use aperl=TRUEwith a(?x)` 修饰符。

  • \D_.+ | \F_.+ 是格式错误的模式,因为 \F 是未知的正则表达式转义。 \D 匹配除数字以外的任何字符,这显然是您没有想到的。

  • \^D_.+ | \^F_.+ 是最接近的,但又有多余的空格,转义的 ^ 匹配文字插入符号。如果您不转义插入符号,它们将匹配字符串位置的开头。

现在,这里最有效的模式是

grepl("^[DF]_.+", text)

含义:

  • ^ - 字符串锚点的开始
  • [DF] - DF 个字母
  • _ - 文字下划线
  • .+ - 任何 1+ 个字符,直到字符串末尾为止。