检查字符串中每个单词的哪些行是大写的并且 space 分隔

Check which rows with each word in a string are capitalised and space separated

我有一个包含值字符串的列,如下所示

a=["iam best in the world" "you are awesome" ,"Iam Good"]

并且我需要检查字符串中每个单词的哪些行是小写字母并由 space 分隔。

我知道如何将它们转换为大写和 space 分隔,但我需要找到哪些行是小写且 space 分隔。

我试过使用

grepl("\b([a-z])\s([a-z])\b",aa, perl =  TRUE)

我们可以尝试使用 grepl 和模式 \b[a-z]+(?:\s+[a-z]+)*\b:

matches = a[grepl("\b[a-z]+(?:\s+[a-z]+)*\b", a$some_col), ]
matches

  v1              some_col
1  1 iam best in the world
2  2       you are awesome

数据:

a <- data.frame(v1=c(1:3),
                some_col=c("iam best in the world", "you are awesome", "Iam Good"))

使用的正则表达式匹配一个 all-lowercase 词,然后是一个 space 和另一个 all-lowercase 词,后者重复零次或多次。请注意,我们在模式周围放置了单词边界,以确保我们不会从以大写字母开头的单词中获得错误的标志匹配。

x <- c("iam best in the word ", "you are awesome", "Iam Good")

这里我做了一些不同的事情,首先我用 space 分隔然后我检查是否是小写。因此,输出是每个短语的列表,只有小写单词被 space.

分割
sapply(strsplit(x, " "), function(x) {
  x[grepl("^[a-z]", x)]
})

我们可以将列转换为lower-case并与实际值进行比较。使用@Tim 的数据

a[tolower(a$some_col) == a$some_col, ]

#  v1              some_col
#1  1 iam best in the world
#2  2       you are awesome

如果我们还需要检查 space,我们可以添加另一个条件 grepl

a[tolower(a$some_col) == a$some_col & grepl("\s+", a$some_col), ]

另一个想法是使用 stringi 包中的 stri_trans_totitle

a[!!!stringi::stri_trans_totitle(as.character(a$some_col)) == a$some_col,]

#  v1              some_col
#1  1 iam best in the world
#2  2       you are awesome

我们可以使用filter

library(dplyr)
a %>%
   filter(tolower(some_col) == some_col)
#   v1              some_col
#1  1 iam best in the world
#2  2       you are awesome