R语言如何从包含5位/9位邮编的地址字符串中提取州名缩写
R语言地址列提取美国州名缩写正则修改方案
问题原因
你当前使用的正则存在两个限制:
- 正向前瞻仅匹配5位纯数字邮编,没有覆盖
XXXXX-XXXX格式的9位邮编场景 - 末尾的
$要求邮编必须在字符串末尾,无法适配邮编后跟随国家名/国家缩写的地址格式
修改后代码
df$state <- str_extract(df$address, "\\b[A-Z]{2}(?=\\s+\\d{5}(?:-\\d{4})?)")
正则说明
\\b匹配单词边界,避免两个大写字母是其他单词的组成部分[A-Z]{2}匹配连续两个大写字母,符合美国州名缩写的通用规则- 正向前瞻
(?=\\s+\\d{5}(?:-\\d{4})?)用于限定匹配规则:\\s+匹配州名缩写和邮编之间的一个或多个空白字符\\d{5}匹配邮编的前5位固定数字(?:-\\d{4})?为非捕获可选组,匹配短横线加4位数字的9位邮编后缀,?表示该部分可出现0次或1次,同时兼容5位和9位邮编
可选优化(降低误匹配概率)
如果要避免匹配到地址中其他非州名的两个大写字母组合,可以添加州名缩写校验逻辑:
# 美国标准州缩写列表可按需补充海外领地缩写 state_abbr <- c("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY") # 过滤无效匹配 df$state <- ifelse(df$state %in% state_abbr, df$state, NA_character_)
内容的提问来源于stack exchange,提问作者Ash Levitt
相关产品推荐
相关产品推荐

