第一次个人编程作业

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.异常处理还不太会做,下次的代码一定会有的グッ!(๑•̀ㅂ•́)و✧

posted @ 2019-09-29 20:23  WAYNEEZHONG  阅读(241)  评论(2编辑  收藏  举报