如何在R语言中从地址数据框提取英国邮政编码?
在R中从地址数据框提取英国邮政编码
嗨,我来帮你搞定这个提取英国邮编的问题!针对你给出的示例地址和需求,我整理了专属R语言的解决方案,用你熟悉的stringr包就能轻松解决。
第一步:确定匹配目标的正则表达式
先看你示例里的邮编SY1 3GZ,它的结构是2个大写字母+1个数字,空格,1个数字+2个大写字母,对应的正则表达式应该是:
"[A-Z]{2}\\d \\d[A-Z]{2}"
如果你确实需要匹配你描述的LETTER_LETTER_DIGIT LETTER_LETTER_DIGIT格式(比如XX1 YY1),那正则改成:
"[A-Z]{2}\\d [A-Z]{2}\\d"
第二步:用stringr+dplyr处理你的数据框
假设你的数据框叫address_df,存储地址的列名叫full_address,操作步骤如下:
先加载必要的包
如果还没安装的话先装一下:
install.packages(c("stringr", "dplyr")) library(stringr) library(dplyr)
提取邮编到新列
针对示例中的邮编格式,直接用mutate和str_extract新增一列存储提取出的邮编:
address_df <- address_df %>% mutate(postcode = str_extract(full_address, "[A-Z]{2}\\d \\d[A-Z]{2}", ignore.case = TRUE))
加ignore.case = TRUE是为了兼容地址里可能出现的小写邮编,不用纠结大小写问题。
第三步:排查你之前尝试失败的可能原因
如果你之前的代码没成功,大概率是这几个问题:
- 大小写不匹配:地址里的邮编可能是小写,刚才的代码已经加了
ignore.case = TRUE,完美解决这个问题。 - 地址里有多余空格/特殊字符:可以先清理地址里的冗余空格,再提取:
address_df <- address_df %>% mutate(clean_address = str_squish(full_address), postcode = str_extract(clean_address, "[A-Z]{2}\\d \\d[A-Z]{2}", ignore.case = TRUE)) - 正则不够通用:如果你的地址里有其他格式的英国邮编(比如1个字母开头的,或者带额外字母的),可以用更全面的通用正则:
# 覆盖绝大多数合法英国邮编的正则 postcode_regex <- "([A-Z]{1,2}\\d[A-Z\\d]? ?\\d[A-Z]{2})" address_df <- address_df %>% mutate(postcode = str_extract(full_address, postcode_regex, ignore.case = TRUE))
测试示例地址
用你给的地址测试,保证能正常提取:
test_address <- "8, Longbow Close, Harlescott Lane, Shrewsbury, England, SY1 3GZ" str_extract(test_address, "[A-Z]{2}\\d \\d[A-Z]{2}", ignore.case = TRUE) # 输出结果就是:"SY1 3GZ"
内容的提问来源于stack exchange,提问作者elliot
相关产品推荐
相关产品推荐

