【问题标题】:How does "gsub" handle spaces?“gsub”如何处理空格?
【发布时间】:2012-02-14 09:40:27
【问题描述】:

我有一个字符串"ab b cde",即"ab[space]b[space]cde"。我想用空格替换“space-b”和“space-c”,这样输出字符串就是"ab[space][space][space][space]de"。我无法弄清楚如何在不删除第一个“b”的情况下摆脱第二个“b”。我试过了:

gsub("[\\sb,\\sc]", " ", "ab b cde", perl=T)

但这给了我"a[spaces]de"。任何指针?谢谢。

编辑:考虑一个更复杂的问题:我想通过删除"space-i" 和"space-ii" 将字符串"akui i ii" 即"akui[space]i[space]ii" 转换为"akui[spaces|"。

【问题讨论】:

    标签: regex r


    【解决方案1】:

    [\sb,\sc] 表示“空格中的一个字符,b,,,空格,c”。 您可能想要(\sb|\sc) 之类的东西,这意味着“空格后跟b,或空格后跟c” 或\s[bc],表示“空格后跟b 或c”。

    s <- "ab b cde"
    gsub( "(\\sb|\\sc)",     "  ", s, perl=TRUE )
    gsub( "\\s[bc]",         "  ", s, perl=TRUE )
    gsub( "[[:space:]][bc]", "  ", s, perl=TRUE )  # No backslashes
    

    要删除一个字母的多个实例(如第二个示例),请在要删除的字母后添加+。

    s2 <- "akui i ii"
    gsub("\\si+", " ", s2)
    

    【讨论】:

    • 谢谢,文森特。但它不适用于“akui i ii”(请参阅​​我对原帖的编辑)。
    【解决方案2】:

    有一个简单的解决方案。

        gsub("\\s[bc]", " ", "ab b cde", perl=T)
    

    这会给你你想要的。

    【讨论】:

      【解决方案3】:

      你可以像这样使用lookbehind matching:

      gsub("(?<=\\s)i+", " ", "akui i ii", perl=T)
      

      编辑: 向后看仍然是要走的路,用您原始帖子中的另一个示例进行了演示。希望这会有所帮助。

      【讨论】:

      • jupp0r... 该代码似乎不适用于我包含在原始帖子中的“akui i ii”。谢谢。
      【解决方案4】:
      x<-"ab b cde"
      gsub(" b| c", "  ",x)
      

      注意第二个参数中的 double 空格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-18
        • 2017-09-27
        • 2023-03-22
        相关资源
        最近更新 更多