从字符串中提取州缩写和邮政编码
Extract state abbreviation and zip code from strings
我想从以下字符串中提取州缩写(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
"
对于邮政编码,我尝试了在这里找到的几种方法,但主要是因为 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
州名缩写不知道怎么提取
感谢任何帮助!提前致谢!
编辑 1:包括 phone 个数字
提取邮政编码的代码:
zip <- str_extract(text, "\d{5}")
提取状态代码的代码:
states <- str_extract(text, "\b[A-Z]{2}(?=\s+\d{5}$)")
提取 phone 个数字的代码:
phone <- str_extract(text, "\b\d{3}-\d{3}-\d{4}\b")
注意: 看起来您的数据有问题,因为最后 2 个邮政编码的长度应该是 5 个字符,而不是 4 个字符。4330
实际上应该是 04330
。如果您无法控制数据源,但可以确定它们是美国代码,您可以根据需要在左侧填充 0。然而,由于您正在寻找 4 或 5 个字符的解决方案,您可以使用这个:
用于提取邮政编码的代码(查找前面的 space 和后面的换行符,以便不选择 phone 号码或地址的部分)
zip <- str_extract(text, "(?<= )\d{4,5}(?=\n|$)")
提取状态代码的代码:
states <- str_extract(text, "\b[A-Z]{2}(?=\s+\d{4,5}$)")
Thank you @Rahul. Both would be great. At least can you show me how to do it with Notepad++?
使用Notepad++提取
那么首先将您的全部数据复制到一个文件中。
按 Ctrl + F 转到 Find
。这将打开搜索对话框。使用正则表达式 ([A-Z]{2}\s*\d{4,5})$
选择 Replace
选项卡搜索并替换为 \n--\n
。这将搜索州缩写和邮政编码并将它们放在新行中,并以 -
作为前缀和后缀。
- 现在转到
Mark
选项卡。选中 Bookmark Line
复选框,然后用 -(.*?)-
搜索并按 Mark All
。这将用 -
. 标记换行的状态 abb 和 ZIP
- 现在转到搜索
-->
书签-->
删除未标记的行
- 最后用
^-|-$
搜索并替换为空字符串。
更新
所以现在也会有 phone 号码?在这种情况下,您只需在步骤 2 中从正则表达式中删除 $。要使用的正则表达式将为 ([A-Z]{2}\s*\d{4,5})
。休息所有步骤将是相同的。
我使用 地址 作为输入而不是文本,看看它是否适合你的情况。
正则表达式假设: 两个大写字母后跟 4 或 5 个数字字母表示州和邮政编码,phone 数字始终在下一行。
输入:
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
"
我正在使用 stringr
库,您可以选择任何其他库来提取您想要的信息。
library(stringr)
df <- data.frame(do.call("rbind",strsplit(str_extract_all(address,"[A-Z][A-Z]\s\d{4,5}\s\d{3}-\d{3}-\d{4}")[[1]],split="\s|\n")))
names(df) <- c("state","Zip","Phone")
编辑:
如果有人想使用文本作为输入,
text <- readLines(textConnection(address))
text <- data.frame(text)
st_zip <- setNames(data.frame(str_extract_all(text$text,"[A-Z][A-Z]\s\d{4,5}",simplify = T)),"St_zip")
pin <- setNames(data.frame(str_extract_all(text$text,"\d{3}-\d{3}-\d{4}",simplify = T)),"pin")
st_zip <- st_zip[st_zip$St_zip != "",]
df1 <- setNames(data.frame(do.call("rbind",strsplit(st_zip,split=' '))),c("State","Zip"))
pin <- pin[pin$pin != "",]
df2 <- data.frame(cbind(df1,pin))
输出:
State Zip pin
1 AK 99577 907-481-1670
2 AL 35007 205-620-0360
3 CT 06854 860-409-0404
4 ID 83338 208-324-4333
5 ME 4330 207-623-8223
6 VT 5495 802-878-5233
我想从以下字符串中提取州缩写(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
"
对于邮政编码,我尝试了在这里找到的几种方法,但主要是因为 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
州名缩写不知道怎么提取
感谢任何帮助!提前致谢!
编辑 1:包括 phone 个数字
提取邮政编码的代码:
zip <- str_extract(text, "\d{5}")
提取状态代码的代码:
states <- str_extract(text, "\b[A-Z]{2}(?=\s+\d{5}$)")
提取 phone 个数字的代码:
phone <- str_extract(text, "\b\d{3}-\d{3}-\d{4}\b")
注意: 看起来您的数据有问题,因为最后 2 个邮政编码的长度应该是 5 个字符,而不是 4 个字符。4330
实际上应该是 04330
。如果您无法控制数据源,但可以确定它们是美国代码,您可以根据需要在左侧填充 0。然而,由于您正在寻找 4 或 5 个字符的解决方案,您可以使用这个:
用于提取邮政编码的代码(查找前面的 space 和后面的换行符,以便不选择 phone 号码或地址的部分)
zip <- str_extract(text, "(?<= )\d{4,5}(?=\n|$)")
提取状态代码的代码:
states <- str_extract(text, "\b[A-Z]{2}(?=\s+\d{4,5}$)")
Thank you @Rahul. Both would be great. At least can you show me how to do it with Notepad++?
使用Notepad++提取
那么首先将您的全部数据复制到一个文件中。
按 Ctrl + F 转到
Find
。这将打开搜索对话框。使用正则表达式([A-Z]{2}\s*\d{4,5})$
选择Replace
选项卡搜索并替换为\n--\n
。这将搜索州缩写和邮政编码并将它们放在新行中,并以-
作为前缀和后缀。
- 现在转到
Mark
选项卡。选中Bookmark Line
复选框,然后用-(.*?)-
搜索并按Mark All
。这将用-
. 标记换行的状态 abb 和 ZIP
- 现在转到搜索
-->
书签-->
删除未标记的行
- 最后用
^-|-$
搜索并替换为空字符串。
更新
所以现在也会有 phone 号码?在这种情况下,您只需在步骤 2 中从正则表达式中删除 $。要使用的正则表达式将为 ([A-Z]{2}\s*\d{4,5})
。休息所有步骤将是相同的。
我使用 地址 作为输入而不是文本,看看它是否适合你的情况。
正则表达式假设: 两个大写字母后跟 4 或 5 个数字字母表示州和邮政编码,phone 数字始终在下一行。
输入:
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
"
我正在使用 stringr
库,您可以选择任何其他库来提取您想要的信息。
library(stringr)
df <- data.frame(do.call("rbind",strsplit(str_extract_all(address,"[A-Z][A-Z]\s\d{4,5}\s\d{3}-\d{3}-\d{4}")[[1]],split="\s|\n")))
names(df) <- c("state","Zip","Phone")
编辑:
如果有人想使用文本作为输入,
text <- readLines(textConnection(address))
text <- data.frame(text)
st_zip <- setNames(data.frame(str_extract_all(text$text,"[A-Z][A-Z]\s\d{4,5}",simplify = T)),"St_zip")
pin <- setNames(data.frame(str_extract_all(text$text,"\d{3}-\d{3}-\d{4}",simplify = T)),"pin")
st_zip <- st_zip[st_zip$St_zip != "",]
df1 <- setNames(data.frame(do.call("rbind",strsplit(st_zip,split=' '))),c("State","Zip"))
pin <- pin[pin$pin != "",]
df2 <- data.frame(cbind(df1,pin))
输出:
State Zip pin
1 AK 99577 907-481-1670
2 AL 35007 205-620-0360
3 CT 06854 860-409-0404
4 ID 83338 208-324-4333
5 ME 4330 207-623-8223
6 VT 5495 802-878-5233