第一次个人编程作业

1.GitHub

[github仓库]:

github

2.PSP表格

PSP2.1 personal software process stages 预计耗时(min) 实际耗时(min)
planing 计划 90 120
estimate 估计这个任务需要多少时间 120 120
development 开发 600 900
analysis 需求分析 30 30
design spec 生成设计文档 30 50
design review 设计复审 30 50
coding standard 代码规范(为目前的开发制定合适的规范) 30 20
design 具体设计 60 90
coding 具体编码 300 480
code review 代码复审 60 50
test 测试(自我测试,修改代码,提交修改) 120 150
reporting 报告 100 80
test report 测试报告 100 100
size measurement 计算工作量 60 60
postmortem&process improvement plan 事后总结,并提出过程改进计划 60 60
合计 1790 2360

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

本次实验主要思想是依靠正则表达式,将读入信息中需要的部分按照要求提取出来;实现是面向过程的,并不是面向对象的,并没有设置任何函数。

整体思路:

先将手机号码提取出来,再利用','分别将姓名和地址提取出来,然后再对地址部分处理,按顺序提出。

对于难度三的题,先按照难度二的处理,再调用高德地图的API补全前面四级的信息。

先是各种正则表达式,用于从字符串中提取需要的内容

略去提取手机和姓名的部分,直接进入地址部分:

因为省份中有直辖市,且直辖市会少一个地级市,所以要对省份和市级特判

loc = line[1]loc_list = []  # 地址列表
p = 0  # p控制开始匹配地址
flag = re.match(sf1, loc[p:])  # 匹配普通省份
if flag:    
    p = p+flag.end()    
    loc_list.append(flag.group(1) + '省')    
    if loc[p] == '省':        
        p = p + 1
else:    
    flag = re.match(sf2, loc[p:])  # 匹配直辖市    
    if flag:        
        loc_list.append(flag.group(1))    
    else:        
        flag = re.match(sf3, loc[p:])        
    	if flag:            
        	p = p + flag.end()            
        	loc_list.append(flag.group(1))  # 匹配自治区        
        else:            
            loc_list.append('')
flag = re.search(sj, loc[p:])  # 匹配地级市

接下来就是对市级以下的地址提取,由于操作其实是重复的,索性就写了一个循环,前面判断了一下难度

n = 4
if num == '1':    
    n = 2for i in range(n):    # 后续匹配
        flag = re.match(pp[i], loc[p:])
        if flag:
            p = p + flag.end()
            loc_list.append(flag.group(0))
        else:
            loc_list.append('')
loc_list.append(loc[p:])

最后就是对3级难度的处理,先是调用高德的API,获取地址的经纬度,然后在获取地址的详细信息,再将其中填到对应的地方

if num=='3':
	url = 'https://restapi.amap.com/v3/geocode/geo?address=' + loc + '&output=XML&key=55102a2c4b79bf8c87cab849177e086a'
	al = requests.get(url).text
    al = re.search('\d+.?\d+,\d+.?\d+', al).group()
    url = 'https://restapi.amap.com/v3/geocode/regeo?output=xml&location=' + al + '&key=55102a2c4b79bf8c87cab849177e086a&radius=1000&extensions=base'
    al = requests.get(url).text
    al = re.search('<province>(.*?)</province>.*?<city>(.*?)</city>.*?<district>(.*?)</district>.*?<township>(.*?)</township>', al)
    if loc_list[0] == '':
    	if al.group(1) in zxs:
        	loc_list[0] = al.group(1)[:2]
            loc_list[1] = al.group(1)
        else:
        	loc_list[0] = al.group(1)
    if loc_list[1] == '':
    	loc_list[1] = al.group(2)
    if loc_list[2] == '':
    	loc_list[2] = al.group(3)
    if loc_list[3] == '':
    	loc_list[3] = al.group(4)

4.性能分析:

Timer unit: 1e-07 s

Total time: 3.30956 s
File: C:/Users/chenminglei/PycharmProjects/location/111.py
Function: main at line 7

Line # Hits Time Per Hit % Time Line Contents
 7                                           def main():
 8         1         32.0     32.0      0.0      sf1 = '^(略)'
 9         1         10.0     10.0      0.0      sf2 = '^(略)'
10         1          7.0      7.0      0.0      sf3 = '^(略)'
11         1          7.0      7.0      0.0      zxs = (略)
12         1          7.0      7.0      0.0      sj = '^(略)'
13         1          7.0      7.0      0.0      pp = (略)
14         1          7.0      7.0      0.0      jj = ('')
15         1   32852193.0 32852193.0     99.3      line = input()
16         1         28.0     28.0      0.0      num = line[:1]
17         1         28.0     28.0      0.0      line = line[2:].strip('.|\n')
18         1       5941.0   5941.0      0.0      tel = re.search(r'(\d){11}', line).group()
19         1         48.0     48.0      0.0      line = line.replace(tel, '')
20         1       1067.0   1067.0      0.0      line = re.split(',', line)
21         1         11.0     11.0      0.0      loc = line[1]
22         1          7.0      7.0      0.0      loc_list = []  # 地址列表
23         1          7.0      7.0      0.0      p = 0  # p控制开始匹配地址
24         1      19138.0  19138.0      0.1      flag = re.match(sf1, loc[p:])  # 匹配普通省份
25         1         22.0     22.0      0.0      if flag:
26         1         22.0     22.0      0.0          p = p+flag.end()
27         1         33.0     33.0      0.0          loc_list.append(flag.group(1) + '省')
28         1         19.0     19.0      0.0          if loc[p] == '省':
29         1         13.0     13.0      0.0              p = p + 1
30                                               else:
31                                                   flag = re.match(sf2, loc[p:])  # 匹配直辖市
32                                                   if flag:
33                                                       loc_list.append(flag.group(1))
34                                                   else:
35                                                       flag = re.match(sf3, loc[p:])
36                                                       if flag:
37                                                           p = p + flag.end()
38                                                           loc_list.append(flag.group(1))  # 匹配自治区
39                                                       else:
40                                                           loc_list.append('')
41         1     197824.0 197824.0      0.6      flag = re.search(sj, loc[p:])  # 匹配地级市
42         1         15.0     15.0      0.0      if flag:
43         1         15.0     15.0      0.0          p = p + flag.end()
44         1         25.0     25.0      0.0          loc_list.append(flag.group(0) + '市')
45         1         12.0     12.0      0.0          if loc[p] == '市':
46         1          8.0      8.0      0.0              p = p + 1
47                                               else:
48                                                   loc_list.append('')
49         1          7.0      7.0      0.0      n = 4
50         1          8.0      8.0      0.0      if num == '1':
51         1          7.0      7.0      0.0          n = 2
52         3         37.0     12.3      0.0      for i in range(n):    # 后续匹配
53         2      18155.0   9077.5      0.1          flag = re.match(pp[i], loc[p:])
54         2         26.0     13.0      0.0          if flag:
55         2         21.0     10.5      0.0              p = p + flag.end()
56         2         33.0     16.5      0.0              loc_list.append(flag.group(0))
57                                                   else:
58                                                       loc_list.append('')
59         1         14.0     14.0      0.0      loc_list.append(loc[p:])
60         1          9.0      9.0      0.0      if num=='3':
61                                                   url = 略
62                                                   al = requests.get(url).text
63                                                   al = re.search('\d+.?\d+,\d+.?\d+', al).group()
64                                                   url = 略
65                                                   al = requests.get(url).text
66                                                   al = re.search('<province>(.*?)</province>.*?<city>(.*?)</city>.*?<district>(.*?)</district>.*?<township>(.*?)</township>', al)
67                                                   if loc_list[0] == '':
68                                                       if al.group(1) in zxs:
69                                                           loc_list[0] = al.group(1)[:2]
70                                                           loc_list[1] = al.group(1)
71                                                       else:
72                                                           loc_list[0] = al.group(1)
73                                                   if loc_list[1] == '':
74                                                       loc_list[1] = al.group(2)
75                                                   if loc_list[2] == '':
76                                                       loc_list[2] = al.group(3)
77                                                   if loc_list[3] == '':
78                                                       loc_list[3] = al.group(4)
79         1         13.0     13.0      0.0      information = {'姓名': line[0], '手机': tel, '地址': loc_list}
80         1        673.0    673.0      0.0      print(json.dumps(information, ensure_ascii=False))

5.测试结果:

输入:

1!冯昔唉,安徽省合肥市庐江县郭河镇G3京台高18835354291速合肥市庐江县广寒桥街道.

2!季宋,湖北咸宁市崇阳县肖岭乡下隽街中共肖岭村支15164791535部委员会.

3!孙旗乖,13366755810白城市洮北区长庆南街65号.

输出:

{"姓名": "冯昔唉", "手机": "18835354291", "地址": ["安徽省", "合肥市", "庐江县", "郭河镇", "G3京台高速合肥市庐江县广寒桥街道"]}

{"姓名": "季宋", "手机": "15164791535", "地址": ["湖北省", "咸宁市", "崇阳县", "肖岭乡", "下隽街", "", "中共肖岭村支部委员会"]}

6.计算模块错误分析:

还有很多种情况没有考虑进去,所以错误还是有很多的

就比如上面正则都是同时判断的,会出现在后面的可能会比在前面的晚匹配的,导致结果的错误

找不到样例(吐血),但这个错误还是存在的

7.实验总结:

这次实验虽然是面向百度的编程,但收获还是不浅的。之前学过一段时间python,由于没法实践,忘得差不多了,靠这次实验捡回了一点,对正则表达式有了初步的掌握。就酱。

posted @ 2019-09-29 20:33  cmlei  阅读(226)  评论(3编辑  收藏  举报