【问题标题】:Regex [[:upper:]] Detecting lower-case but not upper-case [duplicate]正则表达式 [[:upper:]] 检测小写但不是大写 [重复]
【发布时间】:2020-05-13 05:06:42
【问题描述】:

我在 R Studio 版本 1.2.1335 中使用 R 版本 3.6.1。

我正在尝试编写一个函数来计算字符串中大写字母的数量。我一直在 grepl 中使用不同的正则表达式语句,并得出了奇怪的结果。

我决定使用 strsplit 将字符串拆分成单独的字符,然后对这些字符进行 sapply 以检查它们是否用 grepl 和 [:upper:] 大写,如下所示:

s <- 'Testing'
strsplit(s, character(0))[[1]]

[1] "T" "e" "s" "t" "i" "n" "g"

unname(sapply(strsplit(s, character(0))[[1]], function(x) grepl(x, '[:upper:]')))

[1] FALSE TRUE FALSE FALSE FALSE FALSE

此输出表明“T”字符不是大写,而“e”字符是。

当我改用正则表达式“A-Z”时:

sapply(strsplit(s, character(0))[[1]], function(x) grepl(x, '[A-Z]'))

我得到所有项目的“FALSE”输出(而“T”字符应该是“TRUE”)。

当我为每个字母单独尝试正则表达式时,我得到的结果与上述输出一致:

grepl('T', '[:upper:]')
grepl('e', '[:upper:]')

这为“T”返回 FALSE,为“e”返回 TRUE。

我真的很困惑我做错了什么。我仍在思考正则表达式语句,我们将不胜感激!

【问题讨论】:

  • 我们需要grepl('[[:upper:]]', strsplit(s, character(0))[[1]]) [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
  • 查看docs如果在(非空)字符串的开头有匹配,则输出的第一个元素是"" - 那这就是为什么当您使用[A-Z] 拆分时,您会得到第一项为FALSE,因为T 是第二项。

标签: r regex rstudio grepl


【解决方案1】:

我们需要[[:upper:]]

grepl('[[:upper:]]', strsplit(s, character(0))[[1]])
#[1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

此外,一旦我们使用[[ 提取list 元素,即这里它是length 1 的listgrep/grepl 被矢量化并且grep/grepl 中的参数按pattern 的顺序排列,后跟x,这是向量

【讨论】:

  • 哇,我觉得自己很傻。非常感谢您的帮助!
猜你喜欢
  • 2019-07-09
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2011-04-22
  • 2010-10-08
相关资源
最近更新 更多