gpt4 book ai didi

正则表达式提取美国邮政编码但不提取伪代码

转载 作者:行者123 更新时间:2023-12-04 19:05:47 28 4
gpt4 key购买 nike

使用 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 代码会找到真正的邮政编码并忽略虚假的相似之处?

最佳答案

这是我的第一个正则表达式答案(我还在学习)所以希望我不会说任何错误的东西来引导你走向错误的方向。

基本上,正如您在问题中所暗示的那样,此正则表达式会查找最后一个看起来像邮政编码的字符串,而后跟一个看起来像邮政编码的字符串

基本语法是 pattern(?!.*pattern)表示匹配 pattern仅当它没有被任何 (?! ) 跟随(否定的前瞻断言,语法: .* )和 pattern
所以我们可以用你有兴趣找到的东西替换模式:
[0-9]{5}(-[0-9]{4})?
即一个数字串[0-9]正好 5 个字符 {5} (可以选择在 ? 后面接另一个定义为连字符的组和另一个长度为 4 的数字串 (-[0-9]{4})
gregexpr把它们放在一起搜索匹配项和 regmatches为我解释结果,我得到:

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")) 
regmatches(zips$address,
gregexpr('[0-9]{5}(-[0-9]{4})?(?!.*[0-9]{5}(-[0-9]{4})?)', zips$address, perl = TRUE))

# [[1]]
# [1] "12345"
#
# [[2]]
# [1] "12345-0000"
#
# [[3]]
# [1] "12345"
#
# [[4]]
# [1] "12345"
#
# [[5]]
# [1] "12345"

关于正则表达式提取美国邮政编码但不提取伪代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25180752/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com