2

src$Review中,每一行都填充了俄语文本。我想计算每一行中的 CAPSLOCK。例如,在“My apple is GREEN”中,我不仅要计算大写字母的数量,还要计算 CAPSLOCK 的数量(没有“My”,只有“GREEN”)。因此,它仅在至少两个字符以大写形式出现时才有效。

现在我的脚本中有以下代码:

capscount <- str_count(src$Review, "[А-Я]")

它只计算大写字母的总数。我只需要 CAPSLOCK 中的字符总数,这意味着只有在单词中至少显示 2 个以下字母(例如,“GREEN”中的“GR”)时才会计算这些字符。

先感谢您。

4

3 回答 3

4

您正在寻找的模式是"\\b[A-Z]{2,}\\b". 它将连续匹配两个或多个大写字母,\\b每边都有边界, , 。即是整体结构,必要时用俄文字母填写。

#test string. A correct count should be 1 0 2
x <- c("My GREEN", "My Green", "MY GREEN")

library(stringr)
str_count(x, "\\b[A-Z]{2,}\\b")
#[1] 1 0 2

library(stringi)
stri_count(x, regex="\\b[A-Z]{2,}\\b")
#[1] 1 0 2

#base R
sapply(gregexpr("\\b[A-Z]{2,}\\b", x), function(x) length(c(x[x > 0])))
#[1] 1 0 2

更新

如果您想要字符数:

sapply(str_match_all(x, "\\b[A-Z]{2,}\\b"), nchar)
于 2015-10-18T12:22:34.360 回答
1

将 Pierre 的正则表达式与ncharand一起使用str_extract_all。使用simplify = TRUEandpaste0连接所有实例。

library(stringr)

string <- c("My applie is GREEN and Her Majesty's apricot is ORANGE", "I have a LARGE sword", "My baby is sick")

nchar(
  paste0(
    str_extract_all(string = string, pattern = "\\b[A-Z]{2,}\\b", simplify = TRUE), 
    collapse = "")
  )
于 2015-10-18T12:34:32.217 回答
1

我维护的qdapRegex包对此有一个正则表达式,这与@Hugh 的正则表达式相同,但 IMO 很高兴将许多常见的正则表达式存储在我可以抓取的库中。 qdapRegex使用stringi作为后端,因此如果您安装了qdapRegex应该可用。

在@Pierre Lafortune 的字符串上:

x <- c("My GREEN", "My Green", "MY GREEN")

library(qdapRegex)
stringi::stri_count_regex(x, grab("@rm_caps"))

## [1] 1 0 2

让我们看一下正则表达式:

grab("@rm_caps")

## "(\\b[A-Z]{2,}\\b)"

在@Hugh 的字符串上:

x2 <- c("My applie is GREEN and Her Majesty's apricot is ORANGE", "I have a LARGE sword", "My baby is sick")
stringi::stri_count_regex(x2, grab("@rm_caps"))

## [1] 2 1 0
于 2015-10-18T13:10:59.247 回答