我正在做一些字符串清理工作,而我正在解决一个问题。我需要清理大约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')
非常感谢任何帮助!
此致 安迪
答案 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.