从不一致且重复的字符

时间:2018-06-23 10:16:24

标签: r substring

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

字符串示例:

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

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

1 个答案:

答案 0 :(得分:2)

这就是您所期望的,在这种情况下,有很多解决方法,gsub是其中一种,您也可以使用str_extract中的stringr或{{ 1}}(来自Base R):

gregexpr

逻辑

使用\ w选择最后一个字母数字词,因为存在多个,因此使用贪婪字符+(一个或多个匹配项),因为它出现在句子的末尾,所以请使用“ $”使其生效,匹配模式是一个单词,另一个单词之间用空格隔开,因此,有两个\ w +和一个\ s +表示空格。将这些匹配项包装在一个捕获组中(使用括号将其用于捕获该匹配项),然后用该捕获组替换整个匹配项,即可得出结果。


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

stringr::str_extract

输出

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

输入数据:

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