2014-12-10 4 views
2

У меня есть вектор символов x и data.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 

Я пытаюсь создать функцию, используя regex для объединения слов в строке у, где они существуют в x.

Я попробовал следующее, чтобы получить желаемый regex, прежде чем пытаться apply с x и y.

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

Я до сих пор sruggling с regex в R, чтобы получить желаемый результат 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. Если да, то сохраните совпадения в противном случае, освободите эти согласованные пробелы.
  • | Логический оператор ИЛИ.
  • \b Граница слова, которая соответствует символу слова и символу, отличному от слова.
  • $ Конец строки якоря.
+1

Yup. Последний из них был тем, что я хотел. Объяснение прекрасно понимает регулярное выражение. – Crops

Смежные вопросы