(На языке R) Как разделить слова по регистру заголовка в строке, такой как «WeLiveInCA», на «We Live In CA», сохраняя при этом сокращения? - PullRequest
3 голосов
/ 26 апреля 2019

(In R) Как разбить слова по регистру заголовка в строке типа «WeLiveInCA» на «We Live In CA», не разбивая аббревиатуры?

Я знаю, как разбить строку на каждую заглавную букву,но выполнение этого приведет к разделению инициализмов / аббревиатур, таких как CA или USSR или даже U.S.A., и мне нужно их сохранить.

Так что я думаю о некотором типе логики, например if a word in a string isn't an initialism then split the word with a space where a lowercase character is followed by an uppercase character.

Мой фрагмент кода ниже разбивает слова с пробелами заглавными буквами, но разбивает инициализаторы, как CA становится C A нежелательно.

s <- "WeLiveInCA"
trimws(gsub('([[:upper:]])', ' \\1', s))
# "We Live In C A"

или другой пример ...

s <- c("IDon'tEatKittensFYI", "YouKnowYourABCs")
trimws(gsub('([[:upper:]])', ' \\1', s))
# "I Don't Eat Kittens F Y I" "You Know Your A B Cs"

Я бы хотел получить следующие результаты:

"We Live In CA"
#
"I Don't Eat Kittens FYI" "You Know Your ABCs"

Но это должно быть широко применимо (не только для моего примера)

1 Ответ

2 голосов
/ 26 апреля 2019

Попробуйте с основанием R gregexpr/regmatches.

s <- c("WeLiveInCA", "IDon'tEatKittensFYI", "YouKnowYourABCs")
regmatches(s, gregexpr('[[:upper:]]+[^[:upper:]]*', s))
#[[1]]
#[1] "We"   "Live" "In"   "CA"  
#
#[[2]]
#[1] "IDon't"  "Eat"     "Kittens" "FYI"    
#
#[[3]]
#[1] "You"  "Know" "Your" "ABCs"

Пояснение.

  1. [[:upper:]]+ соответствует одной или нескольким заглавным буквам;
  2. [^[:upper:]]* соответствует нулю или большему количеству вхождений чего-либо, кроме букв верхнего регистра.
  3. В последовательности эти два регулярных выражения соответствуют словам, начинающимся с букв (букв) верхнего регистра, за которыми следует что-то еще.
...