使用R语言正则表达式拆分含数字的地址组件
解决地址拆分的正则表达式调整方案
核心思路
先统一移除所有逗号,再通过正则精准捕获三个关键部分:
- 街道名:从地址开头到第一个数字串前的所有文本(保留RUA/AV这类前缀及完整名称)
- 门牌号:第一个连续数字序列(支持前导零)
- 补充信息:门牌号之后的所有剩余文本
完整R代码实现
library(tidyr) library(stringr) # 原始地址数据 addresses <- c( "RUA DOS PASSOS 1523 CS 2", "AV CAXIAS, 02 CASA 05", "AV 11 DE NOVEMBRO 2032 CASA 4", "RUA 05 DE OUTUBRO, 25 CASA 02" ) # 第一步:移除所有逗号,统一地址格式 clean_addresses <- str_remove_all(addresses, ",") # 第二步:用正则拆分地址为指定字段 address_df <- extract( data.frame(address = clean_addresses), col = address, into = c("no_logradouro", "nu_logradouro", "complemento"), regex = "^([^0-9]+)\\s+(\\d+)\\s+(.*)$", remove = FALSE ) # 清理街道名末尾的多余空格 address_df$no_logradouro <- str_trim(address_df$no_logradouro) # 查看结果 print(address_df)
正则表达式解析
^([^0-9]+)\\s+(\\d+)\\s+(.*)$
^([^0-9]+):捕获从地址开头到第一个数字前的所有非数字文本,确保完整匹配街道名称\\s+:匹配街道名与门牌号之间的一个或多个空格,兼容地址里的空格格式差异(\\d+):捕获连续数字序列,完美支持带前导零的门牌号\\s+:匹配门牌号与补充信息之间的空格(.*)$:捕获门牌号之后的所有剩余内容,覆盖各类补充信息格式
最终输出结果
| address | no_logradouro | nu_logradouro | complemento |
|---|---|---|---|
| RUA DOS PASSOS 1523 CS 2 | RUA DOS PASSOS | 1523 | CS 2 |
| AV CAXIAS 02 CASA 05 | AV CAXIAS | 02 | CASA 05 |
| AV 11 DE NOVEMBRO 2032 CASA 4 | AV 11 DE NOVEMBRO | 2032 | CASA 4 |
| RUA 05 DE OUTUBRO 25 CASA 02 | RUA 05 DE OUTUBRO | 25 | CASA 02 |
内容的提问来源于stack exchange,提问作者Pedro Cunha
相关产品推荐
相关产品推荐

