Определить, есть ли первая буква каждого слова заглавными буквами

Я пытаюсь определить, есть ли первая буква каждого слова в данной строке прописными или нет.

У меня такая проблема

x <- c("Bachelor of Technology - Computers + Bachelor of Technology - Science",
       "Hello Sam ,How Are You?", "Certificate - Internet and Web Technology")

Я ожидаю выхода как

FALSE,TRUE,FALSE

3 ответа

Решение

Как насчет проверки на обратное (граница слова, за которой следует строчная буква) и отрицания результата?

!grepl("\\b(?=[a-z])", x, perl = TRUE)
#[1] FALSE  TRUE FALSE

Если вы хотите учитывать только слова, которые идут после пробела, вы можете настроить его следующим образом:

!grepl("\\s+[a-z]", x)

Вот подход без регулярных выражений,

sapply(strsplit(x, '[[:punct:]]|\\s+'), function(i){i1 <- substr(trimws(i), 1, 1); 
                                              all(i1[i1 != ''] == toupper(i1[i1 != '']))})

#[1] FALSE  TRUE FALSE

Если вы хотите добавить / удалить разделители, вы можете сделать это в аргументе strsplit

Вот решение, использующее некоторые дополнительные детали, если они вам нужны.

library(stringi)
#split string into its single elements but maintain all elements
#by using lookaround regex
x_split <- stri_split_regex(x, "(?=\\b)")
#check each element in uppercase
upper_check <- lapply(x_split, function(x) stri_detect_regex(x, "^\\p{Lu}"))
#combine the information
#(all steps might of course be done in a single call,
#just separated the steps here for demonstration)
mapply(function(x,y) rbind(string = x, start_w_upper = y), x_split, upper_check)
# [[1]]
#              [,1]    [,2]       [,3]    [,4]    [,5]    [,6]         [,7]    [,8]        [,9]    [,10]      [,11]  
# string        ""      "Bachelor" " "     "of"    " "     "Technology" " - "   "Computers" " + "   "Bachelor" " "    
# start_w_upper "FALSE" "TRUE"     "FALSE" "FALSE" "FALSE" "TRUE"       "FALSE" "TRUE"      "FALSE" "TRUE"     "FALSE"
# [,12]   [,13]   [,14]        [,15]   [,16]     [,17]  
# string        "of"    " "     "Technology" " - "   "Science" ""     
# start_w_upper "FALSE" "FALSE" "TRUE"       "FALSE" "TRUE"    "FALSE"
# 
# [[2]]
#              [,1]    [,2]    [,3]    [,4]   [,5]    [,6]   [,7]    [,8]   [,9]    [,10]  [,11]  
# string        ""      "Hello" " "     "Sam"  " ,"    "How"  " "     "Are"  " "     "You"  "?"    
# start_w_upper "FALSE" "TRUE"  "FALSE" "TRUE" "FALSE" "TRUE" "FALSE" "TRUE" "FALSE" "TRUE" "FALSE"
# 
# [[3]]
#              [,1]    [,2]          [,3]    [,4]       [,5]    [,6]    [,7]    [,8]   [,9]    [,10]        [,11]  
# string        ""      "Certificate" " - "   "Internet" " "     "and"   " "     "Web"  " "     "Technology" ""     
# start_w_upper "FALSE" "TRUE"        "FALSE" "TRUE"     "FALSE" "FALSE" "FALSE" "TRUE" "FALSE" "TRUE"       "FALSE"
Другие вопросы по тегам