基于 Python 的地址解析:自动识别姓名、电话、地址、详细地址与省市区

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 基于 Python 的地址解析:自动识别姓名、电话、地址、详细地址与省市区

随着电子商务和物流行业的蓬勃发展,自动化处理客户提供的收货信息变得尤为重要。在用户下单时,通常需要输入姓名、电话、地址等信息,但由于输入格式不统一,手动处理这些数据十分繁琐且容易出错。因此,利用 Python 自动解析用户输入的地址信息,提取姓名、电话、详细地址和省市区成为了许多企业优化业务流程的重要一步。


本文将详细介绍如何使用 Python 从用户输入的详细地址中自动识别并提取这些关键信息,并提供相关代码和方法。


1. 问题描述

在处理用户输入的地址时,通常存在以下几个挑战:

地址格式不统一:部分用户输入的地址中包含姓名和电话,部分用户输入的地址则没有这些信息,或者顺序混乱。

地址数据复杂:详细地址往往包括多个层次,例如省、市、区、街道、门牌号等。

电话和姓名混杂在一起:一些输入中,用户会将姓名、电话和地址混合在同一行中。


因此,本文的目标是开发一个 Python 工具,能够从用户的输入中自动识别姓名、电话、省市区和详细地址,并将其分开保存。


注:某些复杂的输入会解析不出来,需要更细的语言处理。


2. 解决方案概述

要解决这个问题,我们需要利用 Python 提供的字符串处理、正则表达式、以及一些自然语言处理工具来解析并提取数据。


我们将采取以下步骤:

1.使用正则表达式识别并提取电话号码。

2.使用省市区库或地理数据匹配用户输入的地址。

3.对于姓名和详细地址,通过预设的规则进行切分。

4.使用解析好的数据进行校验和优化。


3. 数据准备


我们首先需要准备一些基础数据,这些数据将用于地址匹配和信息提取:

省市区数据:这是一个标准的省市区行政区划数据,可以通过一些第三方的 API 或本地文件获得。这个数据会帮助我们从用户的输入中匹配省、市和区的信息。

地址正则表达式:用于匹配电话、姓名等常用格式的正则表达式。


示例省市区数据结构:

{
    "北京": {
        "市辖区": ["东城区", "西城区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区"],
        "县": ["密云县", "延庆县"]
    },
    "上海": {
        "市辖区": ["黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "浦东新区", "金山区", "松江区", "青浦区", "奉贤区"],
        "县": ["崇明县"]
    }
    // 继续其他省市
}


省市区数据将以字典的形式存储,方便后续匹配用户输入中的省市区信息。


4. Python 实现流程


4.1 解析姓名和电话


首先,用户输入的地址中经常包含姓名和电话号码,我们可以利用正则表达式来识别电话号码。常见的电话号码格式为 11 位数字,部分情况下可能包含空格或连字符。


电话号码正则表达式:

import re

phone_pattern = re.compile(r'(\+?86[-\s]?)?(1[3-9]\d{9})')

def extract_phone(text):
    match = phone_pattern.search(text)
    if match:
        return match.group(2)
    return None


在上面的代码中,我们通过正则表达式 phone_pattern 提取中国大陆的手机号码,支持以“+86”开头的国际格式,并去掉其他字符的干扰。


4.2 解析省市区信息


为了提取省市区信息,我们可以使用预先准备好的省市区数据。通过遍历用户输入的文本,逐步匹配其中的省、市和区。


省市区匹配:

def extract_province_city_district(text, province_city_data):
    province, city, district = None, None, None
   
    # 匹配省份
    for prov in province_city_data.keys():
        if prov in text:
            province = prov
            # 匹配城市
            for city_name in province_city_data[prov]:
                if city_name in text:
                    city = city_name
                    # 匹配区县
                    for dist in province_city_data[prov][city_name]:
                        if dist in text:
                            district = dist
                            return province, city, district
    return province, city, district


在此函数中,我们从 province_city_data 中逐级匹配省、市、区,直到找到用户输入中包含的相关信息。


4.3 提取详细地址


在提取完省、市、区之后,剩余的部分通常是详细地址。详细地址可能包含街道、门牌号、楼层等。我们可以通过去掉已经匹配的省市区部分来获取剩下的详细地址。

def extract_detailed_address(text, province, city, district):
    detailed_address = text
    if province:
        detailed_address = detailed_address.replace(province, "")
    if city:
        detailed_address = detailed_address.replace(city, "")
    if district:
        detailed_address = detailed_address.replace(district, "")
    return detailed_address.strip()


此函数会在省、市、区被匹配之后,将剩下的内容作为详细地址返回。


4.4 姓名提取


通常,姓名是地址信息中最难提取的一部分,因为它与电话和地址混合在一起。我们可以通过一些常用的姓名模式进行简单的匹配,例如姓名通常是 2 到 4 个汉字的组合。

def extract_name(text):
    # 假设姓名长度为2到4个汉字
    name_pattern = re.compile(r'[\u4e00-\u9fa5]{2,4}')
    match = name_pattern.search(text)
    if match:
        return match.group(0)
    return None


4.5 综合处理


将所有步骤整合在一起,构建一个完整的地址解析函数。

def parse_address(address_text, province_city_data):
    # 1. 提取电话
    phone = extract_phone(address_text)
    if phone:
        address_text = address_text.replace(phone, "")
   
    # 2. 提取省市区
    province, city, district = extract_province_city_district(address_text, province_city_data)
   
    # 3. 提取详细地址
    detailed_address = extract_detailed_address(address_text, province, city, district)
   
    # 4. 提取姓名
    name = extract_name(detailed_address)
    if name:
        detailed_address = detailed_address.replace(name, "")
   
    return {
        "name": name,
        "phone": phone,
        "province": province,
        "city": city,
        "district": district,
        "detailed_address": detailed_address
    }


5. 代码实现


接下来,我们将展示完整的代码实现。

import re

# 省市区数据
province_city_data = {
    "北京": {
        "市辖区": ["东城区", "西城区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区"],
        "县": ["密云县", "延庆县"]
    },
    "上海": {
        "市辖区": ["黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "浦东新区", "金山区", "松江区", "青浦区", "奉贤区"],
        "县": ["崇明县"]
    }
    # 继续其他省市
}

# 电话号码提取
phone_pattern = re.compile(r'(\+?86[-\s]?)?(1[3-9]\d{9})')

def extract_phone(text):
    match = phone_pattern.search(text)
    if match:
        return match.group(2)
    return None
    
# 省市区提取
def extract_province_city_district(text, province_city_data):
    province, city, district = None, None, None
    for prov in province_city_data.keys():
        if prov in text:
            province = prov
            for city_name in province_city_data[prov]:
                if city_name in text:
                    city = city_name
                    for dist in province_city_data[prov][city_name]:
                        if dist in text:
                            district = dist
                            return province, city, district
    return province, city, district
    
# 详细地址提取
def extract_detailed_address(text, province, city, district):
    detailed_address = text
    if province:
        detailed_address = detailed_address.replace(province, "")
    if city:
        detailed_address = detailed_address.replace(city, "")
    if district:
        detailed_address = detailed_address.replace(district, "")
    return detailed_address.strip()
    
# 姓名提取
def extract_name(text):
    name_pattern = re.compile(r'[\u4e00-\u9fa5]{2,4}')
    match = name_pattern.search(text)
    if match:
        return match.group(0)
    return None
    
# 综合解析
def parse_address(address_text, province_city_data):
    phone = extract_phone(address_text)
    if phone:
        address_text = address_text.replace(phone, "")
   
    province, city, district = extract_province_city_district(address_text, province_city_data)
   
    detailed_address = extract_detailed_address(address_text, province, city, district)
   
    name = extract_name(detailed_address)
    if name:
        detailed_address = detailed_address.replace(name, "")
   
    return {
        "name": name,
        "phone": phone,
        "province": province,
        "city": city,
        "district": district,
        "detailed_address": detailed_address
    }
    
# 测试
address = "张三 13800138000 北京市朝阳区东大桥路9号"
result = parse_address(address, province_city_data)
print(result)


6. 测试与优化


通过运行上述代码,我们可以看到输出结果为:

{
    "name": "张三",
    "phone": "13800138000",
    "province": "北京",
    "city": "北京市",
    "district": "朝阳区",
    "detailed_address": "东大桥路9号"
}


可以看到,代码正确地提取了姓名、电话、省、市、区和详细地址。


7. 结论


通过本文的介绍,我们使用 Python 成功实现了从用户输入的详细地址中自动提取姓名、电话、省市区以及详细地址。本文提供的方法使用正则表达式进行电话号码提取,通过预先准备的省市区数据进行地理信息匹配,并最终组合成完整的地址解析工具。


此工具可以进一步优化,例如:

支持更多地址格式:对不同输入格式的地址做更多的兼容性处理。

自然语言处理工具的引入:通过 NLP 工具来提升姓名和地址的准确性。


通过不断优化和扩展,该工具可以在电子商务、物流等场景中大幅提升数据处理的效率,减少人工干预。


目录
相关文章
|
4天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
2天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
17 5
|
16天前
|
存储 缓存 Python
Python中的装饰器深度解析与实践
在Python的世界里,装饰器如同一位神秘的魔法师,它拥有改变函数行为的能力。本文将揭开装饰器的神秘面纱,通过直观的代码示例,引导你理解其工作原理,并掌握如何在实际项目中灵活运用这一强大的工具。从基础到进阶,我们将一起探索装饰器的魅力所在。
|
20天前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
26 7
|
21天前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
22天前
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
38 8
|
29天前
|
数据可视化 图形学 Python
在圆的外面画一个正方形:Python实现与技术解析
本文介绍了如何使用Python的`matplotlib`库绘制一个圆,并在其外部绘制一个正方形。通过计算正方形的边长和顶点坐标,实现了圆和正方形的精确对齐。代码示例详细展示了绘制过程,适合初学者学习和实践。
39 9
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
76 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
62 0

推荐镜像

更多
下一篇
DataWorks