2014-12-10 3 views
2

다음과 같이 문자 벡터 xdata.framey이 있습니다. 문자열에서 선택한 단어 사이의 공백 제거

x <- c("Pumpkin Helmet", "Warm Puppy", "Frisbee Sailing", 
     "Warm Puppy Frisbee Sailing", "Good Sport", "Masked Marvel", 
     "Spring Dance", "Spring Warm Dance Puppy", "Sock it to Me", 
     "Maskedspring Dancemarvel", "warm Puppy", "masked marvel", 
     "WARM PUPPY", " Spring Dance", "Warm Puppy Spring Dance", 
     "Warmspring Dancepuppy") 
x 
[1] "Pumpkin Helmet"    "Warm Puppy"    "Frisbee Sailing"   
[4] "Warm Puppy Frisbee Sailing" "Good Sport"     "Masked Marvel"    
[7] "Spring Dance"    "Spring Warm Dance Puppy" "Sock it to Me"    
[10] "Maskedspring Dancemarvel" "warm Puppy"     "masked marvel"    
[13] "WARM PUPPY"     " Spring Dance"    "Warm Puppy Spring Dance" 
[16] "Warmspring Dancepuppy" 

a <- c("Masked", "Warm", "spring") 
b <- c("Marvel", "Puppy", "dance") 
y <- data.frame(a,b) 

y 
     a  b 
1 Masked Marvel 
2 Warm Puppy 
3 spring dance 

나는 그들이 x에 존재하는 곳 Y의 행에있는 단어를 병합 regex를 사용하는 함수를 만들려고하고 있습니다.

나는 을 얻으려고하기 전에 다음과 같이 시도했다. applyxy으로 시도했다. 나는 아직도 R에서 regex와 sruggling하고

gsub("Spring(\\s+)Dance.*", "SpringDance", x) 
gsub("spring(\\s+)Dance.*", "SpringDance", x) 
gsub("Warm(\\s+)Puppy.*", "WarmPuppy", x) 

는 원하는 출력 out을 얻을 수 있습니다. 이 경우에는 이상적인 regex이 무엇입니까? 전체 단어 만 일치해야하며 대소 문자를 무시하고 중간에 여러 개의 공백을 제거해야합니다. 당신이 뭔가를 원하는 것처럼

out <- c("Pumpkin Helmet", "WarmPuppy", "Frisbee Sailing", 
     "WarmPuppy Frisbee Sailing", "Good Sport", "MaskedMarvel", 
     "SpringDance", "Spring Warm Dance Puppy", "Sock it to Me", 
     "Maskedspring Dancemarvel", "warmPuppy", "maskedmarvel", 
     "WARMPUPPY", " SpringDance", "WarmPuppy SpringDance", 
     "Warmspring Dancepuppy") 

[1] "Pumpkin Helmet"   "WarmPuppy"     "Frisbee Sailing"   
[4] "WarmPuppy Frisbee Sailing" "Good Sport"    "MaskedMarvel"    
[7] "SpringDance"    "Spring Warm Dance Puppy" "Sock it to Me"    
[10] "Maskedspring Dancemarvel" "warmPuppy"     "maskedmarvel"    
[13] "WARMPUPPY"     " SpringDance"    "WarmPuppy SpringDance"  
[16] "Warmspring Dancepuppy" 

답변

4

> gsub("(?i)(?<=^Spring|^warm|^masked)\\s+(?=Dance|puppy|marvel)\\b|\\b(?<=Spring|warm|masked)\\s+(?=Dance$|puppy$|marvel$)", "", x, perl=T) 
[1] "Pumpkin Helmet"   "WarmPuppy"     "Frisbee Sailing"   
[4] "WarmPuppy Frisbee Sailing" "Good Sport"    "MaskedMarvel"    
[7] "SpringDance"    "Spring Warm Dance Puppy" "Sock it to Me"    
[10] "Maskedspring Dancemarvel" "warmPuppy"     "maskedmarvel"    
[13] "WARMPUPPY"     " SpringDance"    "WarmPuppy SpringDance"  
[16] "Warmspring Dancepuppy" 

설명, 보인다 :

  • (?i) 대소 문자를 구별 수정은 대소 문자를 구분 모드를 설정하는 데 도움이됩니다.
  • (?<=^Spring|^warm|^masked) 시작 부분에있는 spring 또는 warm 또는 masked 문자열을 살펴 봅니다.
  • \\s+, 그렇다면 다음 하나 이상의 공백과 일치하십시오.
  • (?=Dance|puppy|marvel)\\b 공백 뒤에 Dance 또는 -puppy 또는 marvel이 오는지도 확인하십시오. 그렇다면 일치를 유지하고 그렇지 않으면 일치하는 공백을 없앱니다.
  • | 논리 OR 연산자.
  • \b 단어 문자와 단어가 아닌 문자 사이에 일치하는 단어 경계입니다.
  • $ 라인 앵커의 끝입니다.
+1

그래. 마지막 하나는 내가 원했던 것입니다. 설명은 정규식을 이해하는 데 아주 좋습니다. – Crops