2014-03-03 5 views
2

안녕하세요, stackoverflow 사용자대문자와 소문자 문자열의 특정 위치에 공백 추가

많은 사람들이 문자열을 수정해야하는 상황에 직면합니다. 문자열 수정과 관련하여 많은 게시물이 개의 게시물을 보았습니다. 그러나, 나는 찾고있는 해결책을 찾아 오지 않았다. . 나는 내 게시물이 비슷한 도전에 직면하게 될 다른 R 사용자들에게 유용 할 것이라고 믿습니다. 문자열 수정에 익숙한 R 사용자로부터 도움을 요청하고 싶습니다.

나는 다음과 같은 문자열을 수정하려고하고있다.

x <- "Marcus HELLNERJohan OLSSONAnders SOEDERGRENDaniel RICHARDSSON" 

이 문자열에는 4 명의 개인이 있습니다. 성은 대문자입니다. 4 명의 가족 중 3 명은 이름이있는 덩어리로 유지됩니다 (예 : HELLNERJohan). 성을 추가하는 성을 분리하고 싶습니다 (예 : HELLNER Johan).

는 내가 같은 상태 필요가 있다고 생각 "다음 소문자 문자가있는 경우, 마지막과 마지막에서 두 번째 대문자와 대문자의 선택 시퀀스 및 추가 공간을."

다음 포스팅은 아마도 다소 관련,하지만 난 아직 서면 코드에 성공하지 않았습니다.

Splitting String based on letters case

은 당신의 관대 한 지원을 주셔서 대단히 감사합니다.

이 발견하고 두 개의 연속 서브 패턴을 캡처하여 작동
+0

스키 팬, 응? 스웨덴으로 가다! – joran

+0

"마커스"와 함께 사는 성은 무엇입니까? –

+0

@RScriv [마커스 헬너 (http://en.wikipedia.org/wiki/Marcus_Hellner), 요한 올슨 (http://en.wikipedia.org/wiki/Johan_Olsson_ (스키)) 등 –

답변

4

는 먼저 하나의 대문자 (가족 이름의 끝에), 및 소문자 다음 상단으로 구성된 다음 구성 (나타 내기 위해 촬영 이름의 시작). 이 두 그룹이 발견되는 곳이면 어디서나 캡처되어 그 사이에 공백이 삽입됩니다 (아래 호출의 "\\1 \\2"). 당신의 이름의 벡터로 벡터를 구분합니다

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

감사 너 조쉬. 이제 문자열 수정을 위해 한 가지 더 배웠습니다. – jazzurro

0

이 제로 폭 lookbehind 및 내다 주장에 정규 표현식을 사용하여 문자열을 분할합니다.

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

고맙습니다, 블루. 결국 각 이름을 추출해야했습니다. 그래서 당신의 제안은 매우 도움이되었습니다! – jazzurro

관련 문제