【发布时间】:2014-08-07 10:57:59
【问题描述】:
使用 XML 包和 XPath 从网站上抓取地址,有时我只能得到一个字符串,其中嵌入了我想要的邮政编码。提取邮政编码很简单,但有时还会出现其他五位数的字符串。
以下是 df 中问题的一些变体。
zips <- data.frame(id = seq(1, 5), address = c("Company, 18540 Main Ave., City, ST 12345", "Company 18540 Main Ave. City ST 12345-0000", "Company 18540 Main Ave. City State 12345", "Company, 18540 Main Ave., City, ST 12345 USA", "Company, One Main Ave Suite 18540, City, ST 12345"))
提取邮政编码(5位和加4位)的R语句如下,但它被门牌号和套房号的虚假邮政编码所欺骗(其他地址字符串中可能存在其他可能性) )。
regmatches(zips$address, gregexpr("\\d{5}([-]?\\d{4})?", zips$address, perl = TRUE))
对上一个 SO 问题的回答建议“正则表达式将返回最后一个连续的五位字符串。它使用负前瞻来确保在返回的字符串之后不存在 5 位字符串。”
Extracting a zip code from an address string
\b\d{5}\b(?!.*\b\d{5}\b)
但是那个问题和答案涉及 PHP,并提供了一个带有 preg_matches()` 的 if 循环我不熟悉那些语言和工具,但这个想法可能是正确的。
我的问题:什么 R 代码会找到真正的邮政编码并忽略虚假相似?
【问题讨论】:
-
@CarlWitthoft:感谢您引用一篇文章,再次强调解析 HTML 和在 HTML 上使用正则表达式之间的区别。取点。我的问题是当解析完成所有它可以做的事情时该怎么做,并返回一个包含大量地址组件的块字符串。那么正则表达式是调用的工具,这不是真的吗?
-
律师,请忽略该评论,它与您的问题无关。只是人们添加毫无意义的 cmets,因为他们认为自己很有趣。鉴于您的问题[从字符串中返回最后一组 5 个连续数字],为此使用正则表达式没有问题。 (也就是说,如果您的问题比这更复杂,那可能不合适。)