| Crates.io | cpca |
| lib.rs | cpca |
| version | 0.2.1 |
| created_at | 2026-01-12 03:05:52.713371+00 |
| updated_at | 2026-01-12 08:23:22.455291+00 |
| description | Chinese Province, City and Area Parser - 中国省市区地址解析库 |
| homepage | |
| repository | https://github.com/laofahai/cpca-rs |
| max_upload_size | |
| id | 2036921 |
| size | 226,559 |
中国省市区地址解析库,用于从自由文本地址中提取省、市、区信息。
[dependencies]
cpca = "0.1"
use cpca::AddressParser;
fn main() {
let parser = AddressParser::new();
// 解析完整地址
let result = parser.parse("广东省深圳市南山区科技园路1号");
println!("省份: {:?}", result.province); // Some("广东省")
println!("城市: {:?}", result.city); // Some("深圳市")
println!("区县: {:?}", result.district); // Some("南山区")
println!("详址: {}", result.detail); // "科技园路1号"
// 支持简称
let result = parser.parse("深圳南山科技园");
assert_eq!(result.province, Some("广东省".to_string()));
assert_eq!(result.city, Some("深圳市".to_string()));
assert_eq!(result.district, Some("南山区".to_string()));
}
// 使用全局解析器(无需手动创建实例)
let result = cpca::parse("北京市朝阳区望京");
// 标准化地址(简称转全称)
let full = cpca::normalize("广东", "深圳", Some("南山"));
assert_eq!(full, "广东省深圳市南山区");
parser.parse("广东省深圳市南山区科技园");
// 省份: 广东省, 城市: 深圳市, 区县: 南山区
parser.parse("广东深圳市南山区");
// 自动识别 "广东" -> "广东省"
parser.parse("深圳市南山区科技园");
// 自动推断省份为 "广东省"
parser.parse("北京市朝阳区");
// 省份: 北京市, 城市: 北京市, 区县: 朝阳区
parser.parse("广西南宁市");
// 自动识别 "广西" -> "广西壮族自治区"
parser.parse("云南省大理白族自治州大理市");
// 正确识别自治州级城市
impl AddressParser {
/// 创建新的解析器实例
fn new() -> Self;
/// 获取全局单例
fn global() -> &'static AddressParser;
/// 解析地址
fn parse(&self, address: &str) -> ParsedAddress;
/// 标准化地址
fn normalize(&self, province: &str, city: &str, district: Option<&str>) -> String;
/// 批量解析
fn parse_batch(&self, addresses: &[&str]) -> Vec<ParsedAddress>;
/// 验证地址有效性
fn is_valid_address(&self, address: &str) -> bool;
/// 获取所有省份
fn provinces(&self) -> Vec<&String>;
/// 获取某省的所有城市
fn cities_of_province(&self, province: &str) -> Vec<&String>;
/// 获取某市的所有区县
fn districts_of_city(&self, city: &str) -> Vec<&String>;
}
pub struct ParsedAddress {
pub province: Option<String>, // 省份
pub city: Option<String>, // 城市
pub district: Option<String>, // 区县
pub detail: String, // 详细地址
}
impl ParsedAddress {
fn is_complete(&self) -> bool; // 是否完整(省市区都有)
fn full_address(&self) -> String; // 拼接完整地址
}
serde - 启用 serde 序列化支持[dependencies]
cpca = { version = "0.1", features = ["serde"] }
行政区划数据来自 AreaCity-JsSpider-StatsGov,包含:
数据更新至 2025 年。
在 M1 Mac 上的基准测试结果:
| 操作 | 耗时 |
|---|---|
| 解析完整地址 | ~500ns |
| 解析简称地址 | ~600ns |
| 标准化地址 | ~200ns |
| 特性 | cpca (Python) | cpca (Rust) |
|---|---|---|
| 分词依赖 | jieba | 无需 |
| 性能 | 较慢 | 快 10-50x |
| 内存 | ~50MB | ~5MB |
| 部署 | 需要 Python | 单一二进制 |
MIT License
欢迎提交 Issue 和 Pull Request!