Добавление пробела в определенной позиции в строке прописных и строчных букв


Уважаемые пользователи stackoverflow,

Многие люди сталкиваются с ситуациями, в которых им нужно изменить строки. Я видел многих. сообщения, связанные с модификацией строк. Но, я не наткнулся на решения, которые я ищу для. Я считаю, что мой пост будет полезен для некоторых других пользователей R, которые столкнутся с подобным проблемы. Я хотел бы обратиться за помощью к пользователям R, которые знакомы со строкой модификация.

Я пытался изменить строку, такую как следующий.

x <- "Marcus HELLNERJohan OLSSONAnders SOEDERGRENDaniel RICHARDSSON"

В этой строке есть четыре человека. Фамилии пишутся заглавными буквами. Три из четырех фамилий остаются в кусках с именами (например, HELLNERJohan). Я хочу отделить фамилии и имена, добавив пробел (например, HELLNER Johan).

Я думаю, что мне нужно сказать что-то вроде " выберите последовательности прописных букв, и добавьте пробел между последней и предпоследней прописными буквами, если есть строчные письма следующие."

Следующий пост, вероятно, несколько релевантен, но я еще не преуспел в написании кодов.

Расщепление строки на основе букв case

Большое спасибо за вашу щедрую поддержку.
2 2

2 ответа:

Это работает путем нахождения и захвата двух последовательных подшаблонов, первый из которых состоит из одной прописной буквы (конец фамилии), а следующий состоит из верхней, а затем строчной буквы (взятой для обозначения начала имени). Везде, где эти две группы находятся, они захватываются и заменяются сами собой пробелом, вставленным между ними ("\\1 \\2" в вызове ниже).

x <- "Marcus HELLNERJohan OLSSONAnders SOEDERGRENDaniel RICHARDSSON"
gsub("([[:upper:]])([[:upper:]][[:lower:]])", "\\1 \\2", x)
# "Marcus HELLNER Johan OLSSON Anders SOEDERGREN Daniel RICHARDSSON"

Если вы хотите разделить вектор на вектор имен, это разбивает строку с помощью регулярного выражения с утверждениями lookbehind и lookahead нулевой ширины.

strsplit(x, split = "(?<=[[:upper:]])(?=[[:upper:]][[:lower:]])", 
  perl = TRUE)[[1]]
# [1] "Marcus HELLNER"     "Johan OLSSON"       "Anders SOEDERGREN" 
# [4] "Daniel RICHARDSSON"