代码之家  ›  专栏  ›  技术社区  ›  Jaccar

从不一致的重复字符中截断r中的字符串

  •  2
  • Jaccar  · 技术社区  · 8 年前

    我正在处理字符串中的地址数据,我只想提取邮政编码。它们始终位于字符串的末尾,但可以是不同的长度(例如,“xxx-xxx”或“xx-xxx”或“xxxx-xxx”)。 它们也始终在它们之前有“\n”-但这在字符串中还发生过几次。我认为理想的解决方案是提取最终“n”之后的所有数据,但我不知道如何做到这一点!我可以找到在特定字符后截断数据的方法,但如果该字符出现多次,则不能。

    字符串示例:

    "22 Generic Road,\nNotville,\nFaketon,\nUnited Kingdom,\nAB1 2CD"
    

    编辑以添加: 为此,我的解决方法是分两步来处理它:首先,将字符串截断为最后11个字符(以确保获得全部邮政编码和所有列的\n);其次,提取后面的所有字符。但这可能不必要地麻烦。

    1 回复  |  直到 8 年前
        1
  •  2
  •   PKumar    8 年前

    这就是你所期望的,在这种情况下,有很多方法可以解决这个问题, gsub 是一种方式,你可以使用 str_extract 从 stringr 或者 gregexpr 从底部R:

    gsub("(.*)\n(\\w+\\s+\\w+)$","\\2", x)
    

    逻辑 以下内容:

    使用\w选择最后一个字母数字字,因为有多个字母数字字因此使用了+(一个或多个匹配项)的贪婪字符,因为它存在于句尾,所以使用“$”使其工作,匹配模式是一个词与另一个词之间用空格隔开,因此存在e两个\w+和一个\s+表示空间。将这些匹配项包装在一个捕获组中(使用括号,它们用于捕获匹配项),并用这个捕获组替换整个匹配项,这样我们就得到了结果。


    使用 stringr::str_extract

    stringr::str_extract(x, "(\\w+\\s+\\w+)$")
    

    输出 以下内容:

    > gsub("(.*)\n(\\w+\\s+\\w+)$","\\2", x)
    [1] "AB1 2CD"
    

    输入数据:

    x <- "22 Generic Road,\nNotville,\nFaketon,\nUnited Kingdom,\nAB1 2CD"