【问题标题】:Count number of occurrences at end of string计算字符串末尾出现的次数
【发布时间】:2015-10-21 16:24:30
【问题描述】:

我想用正则表达式计算字符串末尾有多少个逗号:

x <- c("w,x,,", "w,x,", "w,x", "w,x,,,")

我想得到:

[1] 2 1 0 3

这给出了:

library(stringi)
stringi::stri_count_regex(x, ",+$")
## [1] 1 1 0 

因为我使用的是量词,但不知道如何计算单个字符最后重复的实际次数。

【问题讨论】:

  • 我只会做nchar(gsub("[^,]", "", x)),但不确定这是否符合您的要求。我想你可能需要举一个逗号不在末尾的例子?
  • 以@DavidArenburg 的评论为基础,nchar(x) - nchar(gsub(",+$", "", x)) 呢?
  • @JasonAizkalns 很好,如果你觉得很好,我会把它添加到我的答案中
  • @DavidArenburg 去吧,虽然我不确定哪个更有效?

标签: r


【解决方案1】:

regexpr 中的 "match.length" 属性似乎可以完成工作(-1 用于区分不匹配和零宽度匹配,例如前瞻)

attr(regexpr(",+$", x), "match.length")
## [1] 2  1 -1  3

另一个选项(来自@JasonAizkalns 的贡献)是

nchar(x) - nchar(gsub(",+$", "", x))
## [1] 2 1 0 3

或者在指定, keepNA = TRUE 时使用stringi 包与nchar 组合(这样不会将匹配项指定为NAs)

library(stringi)
nchar(stri_extract_all_regex(x, ",+$"), keepNA = TRUE)
## [1] 2  1 NA  3

【讨论】:

  • 不错!我想知道为什么 length 是 '-1' 不匹配。那么什么时候长度为'0'呢?
  • 我认为 0 代表前瞻?
  • 是的,前瞻是零宽度 attr(regexpr("(?=,)", x, perl=TRUE),"match.length")
  • @Tyler,添加了其他可能的字符串解决方案。
猜你喜欢
  • 2012-06-24
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2012-02-12
相关资源
最近更新 更多