本文目录导读:

Python 版本(最常用)
基础拆分函数
import re
def split_address(address):
"""
将地址字符串拆分为省、市、区
"""
# 定义省级关键词
provinces = ['北京', '天津', '上海', '重庆']
province_keywords = ['省', '自治区', '特别行政区']
# 初始化结果
result = {
'province': '',
'city': '',
'district': '',
'detail': ''
}
if not address:
return result
# 处理直辖市
for province in provinces:
if address.startswith(province):
result['province'] = province
address = address[len(province):]
break
# 处理普通省份(如广东省、浙江省等)
if not result['province']:
for keyword in province_keywords:
if keyword in address[:10]: # 在地址前10个字符查找
idx = address.index(keyword) + len(keyword)
result['province'] = address[:idx]
address = address[idx:]
break
# 处理市级(以市、州、盟等结尾)
city_endings = ['市', '州', '盟']
for ending in city_endings:
if ending in address[:10]:
idx = address.index(ending) + len(ending)
result['city'] = address[:idx]
address = address[idx:]
break
# 处理区级
district_endings = ['区', '县', '县级市']
for ending in district_endings:
if ending in address[:10]:
idx = address.index(ending) + len(ending)
result['district'] = address[:idx]
address = address[idx:]
break
# 剩余部分为详细地址
result['detail'] = address.strip()
return result
# 使用示例
addresses = [
'广东省深圳市南山区科技园南区',
'北京市朝阳区建国路88号',
'浙江省杭州市西湖区文三路478号',
'上海市浦东新区陆家嘴金融区'
]
for addr in addresses:
result = split_address(addr)
print(f"原始地址: {addr}")
print(f"省: {result['province']}")
print(f"市: {result['city']}")
print(f"区: {result['district']}")
print(f"详细: {result['detail']}")
print("-" * 30)
进阶版(使用正则表达式)
import re
def advanced_split_address(address):
"""
使用正则表达式的高级地址拆分
"""
patterns = {
'province': r'([\u4e00-\u9fa5]{2,}(?:省|自治区|特别行政区)|北京|天津|上海|重庆)',
'city': r'([\u4e00-\u9fa5]{2,}(?:市|州|盟))',
'district': r'([\u4e00-\u9fa5]{2,}(?:区|县|县级市))'
}
result = {
'province': '',
'city': '',
'district': '',
'detail': ''
}
temp = address
for key, pattern in patterns.items():
match = re.search(pattern, temp)
if match:
result[key] = match.group(1)
temp = temp[match.end():]
break
result['detail'] = temp.strip()
return result
JavaScript 版本
function splitAddress(address) {
// 定义拆分规则
const rules = {
province: /(北京|天津|上海|重庆|[\u4e00-\u9fa5]+省|[\u4e00-\u9fa5]+自治区|[\u4e00-\u9fa5]+特别行政区)/,
city: /([\u4e00-\u9fa5]+市|[\u4e00-\u9fa5]+州|[\u4e00-\u9fa5]+盟)/,
district: /([\u4e00-\u9fa5]+区|[\u4e00-\u9fa5]+县|[\u4e00-\u9fa5]+县级市)/
};
const result = {
province: '',
city: '',
district: '',
detail: ''
};
let temp = address;
// 按顺序提取省市区
for (const [key, pattern] of Object.entries(rules)) {
const match = temp.match(pattern);
if (match) {
result[key] = match[1];
temp = temp.substring(match.index + match[1].length);
}
}
result.detail = temp.trim();
return result;
}
// 使用示例
const addresses = [
'广东省深圳市南山区科技园南区',
'北京市朝阳区建国路88号',
'浙江省杭州市西湖区文三路478号'
];
addresses.forEach(addr => {
const result = splitAddress(addr);
console.log(`省: ${result.province}`);
console.log(`市: ${result.city}`);
console.log(`区: ${result.district}`);
console.log(`详细: ${result.detail}`);
console.log('---');
});
Excel VBA 版本
Function SplitAddress(ByVal address As String) As String()
Dim result(3) As String
Dim temp As String
Dim i As Integer
temp = address
' 省的定义
Dim provinces As Variant
provinces = Array("北京", "天津", "上海", "重庆", _
"省", "自治区", "特别行政区")
' 提取省
For i = 0 To UBound(provinces)
If InStr(temp, provinces(i)) > 0 Then
If i <= 3 Then ' 直辖市
result(0) = Left(temp, 2)
temp = Mid(temp, 3)
Exit For
Else
Dim pos As Integer
pos = InStr(temp, provinces(i))
result(0) = Left(temp, pos + Len(provinces(i)) - 1)
temp = Mid(temp, pos + Len(provinces(i)))
Exit For
End If
End If
Next i
' 提取市
Dim cities As Variant
cities = Array("市", "州", "盟")
For i = 0 To UBound(cities)
pos = InStr(temp, cities(i))
If pos > 0 And pos < 10 Then
result(1) = Left(temp, pos)
temp = Mid(temp, pos + 1)
Exit For
End If
Next i
' 提取区
Dim districts As Variant
districts = Array("区", "县", "县级市")
For i = 0 To UBound(districts)
pos = InStr(temp, districts(i))
If pos > 0 And pos < 10 Then
result(2) = Left(temp, pos)
temp = Mid(temp, pos + 1)
Exit For
End If
Next i
' 详细地址
result(3) = Trim(temp)
SplitAddress = result
End Function
' 使用示例
' 在Excel单元格中使用: =SplitAddress(A1)
使用第三方库(推荐用于生产环境)
Python 使用 cpca 库
# 安装: pip install cpca
import cpca
def split_address_cpca(addresses):
"""
使用 cpca 库进行地址拆分
"""
df = cpca.transform(addresses)
return df
# 使用示例
addresses = ['广东省深圳市南山区科技园南区', '北京市朝阳区建国路88号']
result_df = split_address_cpca(addresses)
print(result_df)
注意事项
-
边界情况处理:
- 直辖市(北京、上海等)
- 自治区(新疆、广西等)
- 特殊行政区(香港、澳门)
-
性能优化:
- 批量处理时使用列表推导或pandas
- 缓存常用地址模式
-
准确性问题:
- 复杂地址可能需要人工审核
- 建议配合地址库使用
选择哪种方案取决于你的具体需求和技术栈,如果需要处理大量数据,建议使用专业的地址解析库。