【问题标题】:R regular expressions: unexpected behavior of "[:digit:]"R 正则表达式:“[:digit:]”的意外行为
【发布时间】:2012-07-16 13:06:29
【问题描述】:

我想从字符向量中提取以数字开头的元素,但我不明白 POSIX 正则表达式语法。

我认为

vec <- c("012 foo", "305 bar", "other", "notIt 7")
grep(pattern="[:digit:]", x=vec)

将返回1 2 4,因为它们是其中有数字的四个元素。但实际上它返回3 4

同样,grep(pattern="^0", x=vec) 返回 1,正如我所料,因为元素 1 以零开头。但是 grep(pattern="^[:digit:]", x=vec) 返回 integer(0) 而我希望它返回 1 2 因为这些是以数字开头的元素。

我对语法有什么误解?

【问题讨论】:

  • 请注意,在 stringr ICU 正则表达式模式中,您可以使用 [:digit:] 而无需额外的括号。但是,建议保留它们以实现跨引擎兼容性。

标签: regex r


【解决方案1】:

试试

grep(pattern="[[:digit:]]", x=vec)

因为冒号之间的“元模式”通常需要双括号。

【讨论】:

  • 这给出了我正在寻找的答案。但是你能解释一下 pattern="[:digit:]" 在做什么吗?我对第一个结果没有任何意义,其中 grep(pattern="[:digit:]", x=vec) 给出 3 4。我认为这指向了一个我不明白的大问题。
  • 查找冒号、d、i、g 或 t。
  • 是的 - 现在一切都说得通了。谢谢。
  • 尽管@triplee 的评论(目前有九个)赞成,但这是完全错误的。有关此正则表达式语法的文档,请参见 here,将 [[:digit:]] 定义为一个数字。
  • 我理解第一条评论中的问题是什么意思,[:digit:]——而不是正确的[[:digit:]]——实际上是做什么的。
【解决方案2】:

另一种解决方案

grep(pattern="\\d", x=vec)

【讨论】:

  • 但是,类似 Perl 的速记字符类不能在 TRE 模式(带有perl=FALSE 的那些)中的否定括号表达式中使用。
【解决方案3】:
man 7 regex

在括号表达式中,用“[:”和“:]”括起来的字符类的名称代表属于该类的所有字符的列表。标准字符类名称是:

         alnum       digit       punct
         alpha       graph       space
         blank       lower       upper
         cntrl       print       xdigit

因此,作为括号表达式的唯一成员的字符类看起来像双括号,例如[[:digit:]]。再举一个例子,考虑[[:alnum:]] 等价于[[:alpha:][:digit:]]

【讨论】:

  • 您可能不是指 R 语法吗?人不是 R 中的命令。
  • 他没有问定义,而是问“我怎么会误解语法?”只是告诉他 RTFM 并没有那么有帮助。
  • 我非常清楚地回答了他的语法,引用了定义。
  • 我认为手动注释很明显:在括号表达式中,用“[:”和“:]”括起来的字符类的名称——这意味着[[:CLASS_NAME:]]
  • 没关系。我只是想,既然我已经批评了你的答案,我应该明确说明我认为会改进它的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多