第一次个人编程作业
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 60 | 60 |
Development | 开发 | 600 | 360 |
· Analysis | · 需求分析 (包括学习新技术) | 180 | 180 |
· Design Spec | · 生成设计文档 | 90 | 60 |
· Design Review | · 设计复审 | 90 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 180 | 180 |
· Code Review | · 代码复审 | 180 | 120 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 180 |
Reporting | 报告 | 60 | 90 |
· Test Repor | · 测试报告 | 60 | 90 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
· 合计 | 1790 | 1590 |
Github链接: https://github.com/wayneZQ/031702544
解题思路
由于本次作业我并没有考虑附加题,所以解题的思路如下:
1.首先判断输入字符串的第一个数字
1.1.1 若为“1”,则执行的是五级地址划分。
1.1.2 若为“2”,则执行的是七级地址划分。
2. 地址划分前共有操作
2.1 利用正则表达式找出“1!”和“2!”并将其替换为空字符串;
2.2 利用正则表达式找出11位手机号码,加以保存后替换为空字符串;
def get_phonenumber(addr):
m = re.search(r'1\d{10}', addr)
phone = m.group()
return phone
2.3 利用正则表达式找出姓名,加以保存后替换为空字符串;
def get_name(addr):
m0 = re.search(r'[\u4e00-\u9fa5]{2,6}(?:,)', addr)
m1 = re.search(r'[\u4e00-\u9fa5]{2,6}', m0.group())
name = m1.group()
return name
2.4将最后的句号也要替换为空字符串
经过以上步骤之后,原先的输入现在就变成一个纯粹的地址了。准备工作就绪后,就可以开始地址的划分了。
3.地址划分阶段共有操作
首先对于前三级地址由于会有像“省”“市”这样的关键字确实,所以正则表达式就不够好用了。所以这里使用了python的cpca库来对前三级地址进行解析。经过解析后,cpca会返回一个Dateframe格式的对象,我们只需要将其转化为列表List就可以了。
addrbox.append(addr)
tran1 = cpca.transform(addrbox, cut=False, open_warning=False)
tran2 = tran1.values.flatten()
tran3 = tran2.tolist()
tmp = tran3[3]
for temp in tran3[0:3]:
answer.append(temp)
将前三级地址提取出来以后,我们就可以开始对后面的地址进行五级解析或者七级解析。
4.五级地址的后两级解析
四级地址主要为区、镇、乡、街道。提取出第四级并替换为空字符后剩下的必为第五级地址。
fourth = re.search(r'.+?(?:区|镇|乡|街道)', tmp)
if fourth is None:
answer.append("")
else:
answer.append(fourth.group())
fifth = re.sub(r'.+?(?:区|镇|乡|街道)', "", tmp)
answer.append(fifth)
5.七级地址的后四级解析
方法与上面类似
fourth = re.search(r'.+?(?:区|镇|乡|街道)', tmp)
if fourth is None:
answer.append("")
else:
answer.append(fourth.group())
tmp = re.sub(r'.+?(?:区|镇|乡|街道)', "", tmp)
fifth = re.match(r'.+?(?:巷|路|街|弄|道)', tmp)
if fifth is None:
answer.append("")
else:
answer.append(fifth.group())
tmp = re.sub(r'.+?(?:巷|路|街|弄|道)', "", tmp)
sixth = re.match(r'.+?(?:号|道)', tmp)
if sixth is None:
answer.append("")
else:
answer.append(sixth.group())
seventh = re.sub(r'.+?(?:号|道)', "", tmp)
answer.append(seventh)
6.转化为json格式进行输出
计算模块接口部分性能改进
由上图可见,耗时主要是在读取上面。
单元测试
测试数据如下:
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
1!支悦,福建福州15607517635福飞南路心连心金融大厦.
2!陈伯茂,15305810259,福建省福州市鼓屏路67号福建省级机关医院.
2!王五,云南省水富18694520738县云川路1号水富火车站货运大楼.
1!万琦,广东深13805204711圳福强路1031福民新村.
1!陈利,广西13006154923南宁市青秀区建政街道方园路1号方园公寓1区.
2!党聪莉,15705217077,湖北省武汉市车城北路58号武汉体育中心.
1!陈杰,13215900209,四川眉山大南街50号中岩大酒店.
1!季波,重庆13707600542南岸区铜元局正街金辉·春上南滨.
2!澹晶,13907836232成都青羊区西华门街17号天府中心.
测试结果:
{"姓名": "李四", "手机": "13756899511", "地址": ["福建省", "福州市", "鼓楼区", "鼓西街道", "湖滨路", "110号", "湖滨大厦一层"]}
{"姓名": "张三", "手机": "13599622362", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "福州大学10#111"]}
{"姓名": "王五", "手机": "18960221533", "地址": ["福建省", "福州市", "鼓楼区", "", "五一北路", "123号", "福州鼓楼医院"]}
{"姓名": "小陈", "手机": "13965231525", "地址": ["广东省", "东莞市", "", "凤岗镇", "凤平路13号"]}
{"姓名": "支悦", "手机": "15607517635", "地址": ["福建省", "福州市", "", "", "福飞南路心连心金融大厦"]}
{"姓名": "陈伯茂", "手机": "15305810259", "地址": ["福建省", "福州市", "", "", ",福建省福州市鼓屏路", "67号", "福建省级机关医院"]}
{"姓名": "王五", "手机": "18694520738", "地址": ["云南省", "昭通市", "水富市", "", "县云川路", "1号", "水富火车站货运大楼"]}
{"姓名": "万琦", "手机": "13805204711", "地址": ["广东省", "深圳市", "", "", "福强路1031福民新村"]}
{"姓名": "陈利", "手机": "13006154923", "地址": ["广西壮族自治区", "南宁市", "青秀区", "建政街道", ""]}
{"姓名": "党聪莉", "手机": "15705217077", "地址": ["湖北省", "武汉市", "", "", ",湖北省武汉市车城北路", "58号", "武汉体育中心"]}
{"姓名": "陈杰", "手机": "13215900209", "地址": ["四川省", "眉山市", "", "", ",四川眉山大南街50号中岩大酒店"]}
测试覆盖率:
小结
1.通过这次作业最重要的就是熟悉了正则表达式的使用 ,正则表达式真是处理字符串相当好用的工具.
2.初学python,封装做的还不够好,这段代码恐怕很难拿来复用 (= ̄㉨ ̄=)
3.异常处理还不太会做,下次的代码一定会有的グッ!(๑•̀ㅂ•́)و✧