【问题标题】:Truncate string in r from an inconsistently placed, duplicated character从位置不一致的重复字符中截断 r 中的字符串
【发布时间】:2026-01-26 05:20:04
【问题描述】:

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

字符串示例:

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

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

【问题讨论】:

    标签: r substring


    【解决方案1】:

    这是您所期望的吗,在这种情况下有很多方法可以解决这个问题,gsub 是其中一种方法,您也可以使用来自stringrstr_extract 或来自Base R 的gregexpr

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

    逻辑

    使用 \w 选择最后一个字母数字单词,因为有多个因此使用 + 的贪婪字符(一个或多个匹配),因为它出现在句子的结尾使用“$”使其工作, 匹配的模式是一个单词与另一个单词用空格分隔,因此有两个 \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"
    

    【讨论】:

    • 是的,这似乎有效!我会将答案标记为正确。效果如何?