第一次个人编程作业

1.Github链接

https://github.com/hzf-hhh/031702342

2.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
· Estimate · 估计这个任务需要多少时间 120 180
Development 开发 60 75
· Analysis · 需求分析 (包括学习新技术) 30 50
· Design Spec · 生成设计文档 40 60
· Design Review · 设计复审 30 50
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 40
· Design · 具体设计 40 60
· Coding · 具体编码 50 60
· Code Review · 代码复审 20 30
· Test · 测试(自我测试,修改代码,提交修改) 60 120
Reporting 报告 30 50
· Test Repor · 测试报告 30 40
· Size Measurement · 计算工作量 20 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
· 合计 610 905

3.模块接口的设计与实现过程

需求

公司给实习生小王安排了一个任务,要求将一份客户地址规范化处理,地址簿原先是这样的:
王先生,13756899511,福建福州闽侯上街镇福州大学.陈先生,15063321552,福建省福州市鼓楼区鼓西街道湖滨路233号.
这样的地址不够规范,公司要求小王将地址规范化为如下的字典格式,并存储为json文件:
[{"姓名":"王先生","手机":"13756899511","地址":["福建省","福州市","闽侯县","上街镇","福州大学"]},
{"姓名":"陈先生","手机":"15063321552","地址":["福建省","福州市","鼓楼区","鼓西街道","湖滨路233号"]}]
可是小王不仅没完成任务,还把原始文件弄乱了,手机号码被混杂在地址数据中,请帮小王恢复文件并完成他的任务。
文件现状:
李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
张三,福建福州闽13599622362侯县上街镇福州大学10#111.
王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
小陈,广东省东莞市凤岗13965231525镇凤平路13号.
请把文件格式化为如下形式:
[{"姓名"':"李四","手机":"13756899511","地址":["福建省","福州市","鼓楼区","鼓西街道", "湖滨路110号湖滨大厦一层"]},
{"姓名":"张三","手机":"13599622362","地址":["福建省","福州市","闽侯县","上街镇", "福州大学10#111"]},
{"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路123号福州鼓楼医院"]},
{"姓名":"小美","手机":"15822153326","地址":["北京","北京市","东城区","","交道口东大街1号北京市东城区人民法院"]},
{"姓名":"小陈","手机":"13965231525","地址":["广东省","东莞市","","凤岗镇","凤平路13号"]}]
请注意:
1.直辖市与一般城市的匹配区别,如样例中的小美。
2.手机号码一定不会和地址中的数字相邻,即不会出现福州市西二环路11380502116922号或者福州大学30#31395521336233这样的情况。
3.地址最终格式应为["直辖市/省","直辖市/市","区/县/县级市","街道/镇/乡","详细地址"]
4.该难度题目不会出现违背题目规则的异常样例。
当你把该任务做好之后,产品经理突发奇想,让你进一步匹配详细地址,进而区分出详细地址中的街道、道路名、门牌号等信息,文件则因变成:
[{"姓名":"李四","手机":"13756899511","地址":["福建省","福州市","鼓楼区","鼓西街道","湖滨路","110号","湖滨大厦一层"]},
{"姓名":"张三","手机":"13599622362","地址":["福建省","福州市","闽侯县","上街镇","","","福州大学10#111"]},
{"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]},
{"姓名":"小美","手机":"15822153326","地址":["北京","北京市","东城区","","交道口东大街","1号","北京市东城区人民法院"]},
{"姓名":"小陈","手机":"13965231525","地址":["广东省","东莞市","","凤岗镇","凤平路","13号",""]}]
请注意:该难度题目中,并非所有的路都叫XX路,也可能叫XX街,XX巷,需自行搜集数据。
产品经理还有个大胆的想法,但是已经被大部分程序员打爆了,没人愿意做,如果你觉得你做得来,可以试一试。地址簿中存在 福建福州市公园路15号 这样的地址,希望能利用地图数据自动补全缺省信息,将其格式化为["福建省","福州市","仓山区","公园路","15号"]或者更完善的形式。(附加题)

解题思路

本题我主要针对的是前两级难度,本题的目的就是根据输入的信息,将其姓名、地址划分开来,另外地址中要将每一级的地址都具体划分开来。

  • 首先先识别具体难度;
  • 其次划分姓名:采用正则表达式关键词搜寻(姓名后面有‘,’);
  • 划分具体地址的时候:
    • 先划分省市区3部分,这边我引入了一个python模块cpca,然后用该模块中的transform函数,该函数可以将地址中的省市区直接解析出来
    • 然后对于后半部分的地址,我采取的方法是使用正则表达式进行关键词解析。

4.模块接口部分的性能改进

刚开始搜索的时候,对省市区是采用关键词搜索,但是后来发现有些会出现地址缺失,因此引进了模块cpca,能够自动匹配省市区,能够省去很多麻烦。

部分代码

x='街道'
y='镇'
z='乡'
if leave.find(x)>0:
first=(re.findall(r".街道",leave))#找出街道
leave=leave.replace(first[0],"")
elif leave.find(y)>0:
first = (re.findall(r".
镇", leave)) # 找出镇
leave = leave.replace(first[0], "")
elif leave.find(y)>0:
first = (re.findall(r".*乡", leave)) # 找出乡
leave = leave.replace(first[0], "")

5.模块部分单元测试展示

  • 输入:2!茅参,上海嘉定区13347914736马陆镇嘉新公路1157号樊家村1256号楼.
    • 输出:
  • 输入:1!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
    • 输出:
  • 输入:2!夹谷抡枯,甘肃兰州城关区18795320124皋兰路街道皋兰路210号郑家台小区.
    • 输出:
  • 输入:2!楚涡握,湖北随州随县吴山镇18883549874唐王街联宏村委会.
    • 输出:
  • 输入:1!卞继主,黑龙江省齐齐哈尔建华区卜奎街道鑫海家园B7号15241257071楼.
    • 输出:
  • 输入:1!庾感裤,宁夏回族自治13963011320区中卫市沙坡头区砖塔村卫生室.
    • 输出:
  • 输入:2!宦塌骨,北京市丰台区马家堡街道角门南路甲14号富13865443474卓苑小区.
    • 输出:
  • 输入:2!何擒,上海徐汇区湖13009955601南路街道汾阳路9弄复襄居委社区活动室.
    • 输出:
  • 输入:2!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
    • 输出:
  • 输入:1!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
    • 输出:

测试覆盖率

6.模块部分异常处理说明

  • 样例:2!夹谷抡枯,甘肃兰州城关区18795320124皋兰路街道皋兰路210号郑家台小区.
    • 异常:WARNING:root:城关区 无法映射, 建议添加进umap中,运行结果:
    • 错误:导致输出结果没有省,市,且后面的街道中也出错.
    • 说明:这是我使用模块cpca的过程中为了后续地址拆分而无法解决的一个bug.
  • 样例:2!何擒,上海徐汇区湖13009955601南路街道汾阳路9弄复襄居委社区活动室.
    • 异常:
    • 错误:路和弄同时出现时会导致错误
  • 样例:2!宦塌骨,北京市丰台区马家堡街道角门南路甲14号富13865443474卓苑小区.
    • 异常:
    • 错误:门牌号带文字的也识别不出来。
posted @ 2019-09-28 17:51  胡噜路  阅读(247)  评论(2编辑  收藏  举报