从字符串中提取州名缩写和邮政编码

Ilo*_*hon 2 regex zipcode text-extraction r

我想从以下字符串中提取州名缩写(2个字母)和邮政编码(4或5个数字)

    address <- "19800 Eagle River Road, Eagle River AK 99577
              907-481-1670
              230 Colonial Promenade Pkwy, Alabaster AL 35007
              205-620-0360
              360 Connecticut Avenue, Norwalk CT 06854
              860-409-0404
              2080 S Lincoln, Jerome ID 83338
              208-324-4333
              20175 Civic Center Dr, Augusta ME 4330
              207-623-8223
              830 Harvest Ln, Williston VT 5495
              802-878-5233
              "
Run Code Online (Sandbox Code Playgroud)

对于邮政编码,我尝试了一些我在这里找到的方法,但它不起作用主要是因为5号街道地址或邮政编码只有4个数字

    text <- readLines(textConnection(address))

    library(stringi)
    zip <- stri_extract_last_regex(text, "\\d{5}")
    zip

    library(qdapRegex)
    rm_zip3 <- rm_(pattern="(?<!\\d)\\d{5}(?!\\d)", extract = TRUE)
    zip <- rm_zip3(text)
    zip

    [1] "99577" "1670"  "35007" "0360"  "06854" "0404"  "83338" "4333"  "4330"  "8223"  "5495"  "5233"  NA 
Run Code Online (Sandbox Code Playgroud)

对于州名缩写,我不知道如何提取

任何帮助表示赞赏!提前致谢!

编辑1:包括电话号码

deg*_*ant 7

提取邮政编码的代码:

zip <- str_extract(text, "\\d{5}")
Run Code Online (Sandbox Code Playgroud)

提取州代码的代码:

states <- str_extract(text, "\\b[A-Z]{2}(?=\\s+\\d{5}$)")
Run Code Online (Sandbox Code Playgroud)

提取电话号码的代码:

phone <- str_extract(text, "\\b\\d{3}-\\d{3}-\\d{4}\\b")
Run Code Online (Sandbox Code Playgroud)

注意: 看起来您的数据存在问题,因为最后2个邮政编码应该是5个字符长而不是4个4330 实际应该是04330.如果您无法控制数据源,但确定它们是美国代码,则可以根据需要在左侧填充0.但是,由于您正在寻找4或5个字符的解决方案,您可以使用:

提取邮政编码的代码(查找前面的空格和后面的换行符,以便不选择电话号码或地址的部分)

zip <- str_extract(text, "(?<= )\\d{4,5}(?=\\n|$)")
Run Code Online (Sandbox Code Playgroud)

提取州代码的代码:

states <- str_extract(text, "\\b[A-Z]{2}(?=\\s+\\d{4,5}$)")
Run Code Online (Sandbox Code Playgroud)

演示:https://regex101.com/r/7Im0Mu/2