【问题标题】:Remove space between selected words in a string删除字符串中选定单词之间的空格
【发布时间】:2015-02-08 06:04:46
【问题描述】:

我有一个字符向量x 和一个data.frame y,如下所示。

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 创建一个函数来合并 y 中的一行中的单词,无论它们存在于x 中。

在尝试使用applyxy 之前,我已经尝试了以下方法来获得所需的regex

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

我仍在努力使用R 中的regex 以获得所需的输出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" 

【问题讨论】:

    标签: regex r string string-matching


    【解决方案1】:

    好像你想要这样的东西,

    > 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)不区分大小写修饰符有助于开启不区分大小写模式。
    • (?&lt;=^Spring|^warm|^masked) 查找开头的字符串 springwarmmasked
    • \\s+,如果是则匹配以下一个或多个空格。
    • (?=Dance|puppy|marvel)\\b 并且还要检查空格后面是否跟Dance 或-puppymarvel。如果是,则保留匹配项,否则会丢失匹配的空格。
    • | 逻辑或运算符。
    • \b 单词字符和非单词字符之间匹配的单词边界。
    • $ 行尾锚。

    【讨论】:

    • 是的。最后一个是我想要的。该解释非常适合理解正则表达式。
    猜你喜欢
    • 2020-05-18
    • 2017-08-24
    • 2020-08-26
    • 2015-06-08
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    相关资源
    最近更新 更多