R:删除字符后但在另一个字符之前的子字符串

时间:2017-10-11 17:19:56

标签: r string stringr

我正在做一些字符串清理工作,而我正在解决一个问题。我需要清理大约2,000,000行地址数据。这是我编写的一个小样本:

addresses <- c('123 Alphabet Road, Denver, CO', '% Andrew L. Doe P.O. BOX 123, New York, NY', '19 Serious Road, Providence, RI', '% Johnny Cupcakes 1947 Numbers Avenue, Boston, MA')

我想保留第一个和第三个元素。对于第二和第四个元素,我想在“P.O”或1947年之前删除所有内容。

虽然只是删除所有字符,直到我点击数字或“P.O.”可以工作,我担心我的一些地址可能与其他字母字符一致。

在我看来,我的方法必须遵循以下步骤:

1)在字符串的开头搜索"%""^\\%" 2)将包含子"%"一直替换为第一个"P\\.O\\."[:digit:]

我仍在努力弄清楚背后/前方。我怀疑我必须混合使用两者才能获得:

c('123 Alphabet Road, Denver, CO', 'P.O. BOX 123, New York, NY', '19 Serious Road, Providence, RI', '1947 Numbers Avenue, Boston, MA')

非常感谢任何帮助!

此致 安迪

1 个答案:

答案 0 :(得分:0)

也许

gsub("^\\%.*?, +", "", addresses)
#output:
[1] "123 Alphabet Road, Denver, CO"   "P.O. BOX 123, New York, NY"      "19 Serious Road, Providence, RI"
[4] "1947 Numbers Avenue, Boston, MA

从字符串开头的%删除,直到第一个逗号和逗号后面的空格为止。

编辑:更严格的例子:

使用前瞻:

gsub("^\\%.*?(?=(P\\.O\\.|\\d))", "", addresses, perl = T)
#output
[1] "123 Alphabet Road, Denver, CO"   "P.O. BOX 123, New York, NY"      "19 Serious Road, Providence, RI"
[4] "1947 Numbers Avenue, Boston, MA"

^\\% - 在字符串
的开头匹配% .*? - 懒惰匹配任何字符(进一步匹配字符串所需的最少) - 尝试没有它(而不是1947年只剩下7个,因为正则表达式本质上是贪婪的)
?=正向前瞻(零长度断言) - 在括号中 (P\\.O\\.|\\d) - P.O.或数字
perl = T - 能够使用lookahead / lookbehind

使用捕获组:

gsub("^\\%.*?(\\d|P\\.O\\.)", "\\1", addresses, perl = T)
#output
[1] "123 Alphabet Road, Denver, CO"   "P.O. BOX 123, New York, NY"      "19 Serious Road, Providence, RI"
[4] "1947 Numbers Avenue, Boston, MA"

^\\%.*? - 与上述相同 () - 捕获组 - 我们稍后可以使用\\1引用其中的符号,最多允许9个捕获组\\1 ... \\9 \\d|P\\.O\\.数字或P.O.