【发布时间】: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是第二项。