如何编写省市区拆分脚本

wen 实用脚本 25

本文目录导读:

如何编写省市区拆分脚本

  1. Python 版本(最常用)
  2. JavaScript 版本
  3. Excel VBA 版本
  4. 使用第三方库(推荐用于生产环境)
  5. 注意事项

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)

注意事项

  1. 边界情况处理

    • 直辖市(北京、上海等)
    • 自治区(新疆、广西等)
    • 特殊行政区(香港、澳门)
  2. 性能优化

    • 批量处理时使用列表推导或pandas
    • 缓存常用地址模式
  3. 准确性问题

    • 复杂地址可能需要人工审核
    • 建议配合地址库使用

选择哪种方案取决于你的具体需求和技术栈,如果需要处理大量数据,建议使用专业的地址解析库。

抱歉,评论功能暂时关闭!