作业1
注意事项
- 邮箱可能为数字或者字符,或-_符号。 AZaz-_
- 后缀可能是字符或数字 AZaz0-9
- 邮箱域名包括com org edu . [com|org|edu]
例: [email protected]
字符串不一定要一次就写成功,可能慢慢测试匹配
#一点一点替换正则表达式
text = "[email protected]"
re.search(r".*",test).group()
个人的作业提交
re.search(r"[a-z0-9A-Z-_]+\@[A-Za-z0-9]+\.com|org|edu+",test).group()
解析:
1. [a-z0-9A-z-_]意思是匹配大写A到Z小写a到z以及"_" "-"这两个符号,后面的加号表示1个或多个
2. \@ 表示匹配@这个字符串 \是转义的意思
3. 后面同上,匹配大写A到Z,小写a到z以及数字,这里匹配的是域名比如上面例子的heibanke2015
4. 接下来匹配一个'.'符号,然后匹配邮箱域名, \.先转义,表示只匹配一个'.',(com|org|edu)表示分支条件,域名必须是括号中的某一个,$表示匹配字符串的结束
作业2
利用随机函数产生一个用户的用户名,密码,并利用文件将用户名密码保存下来
分析
- 考察随机函数的使用。
- 考察文件的使用
随机数random文档可以参考9.6. random — Generate pseudo-random numbers
此模块实现的伪随机数,支持数字、字符串、列表和元组。一些demo如下:
>>> random.random() # Random float x, 0.0 <= x < 1.0
0.37444887175646646
>>> random.uniform(1, 10) # Random float x, 1.0 <= x < 10.0
1.1800146073117523
>>> random.randint(1, 10) # Integer from 1 to 10, endpoints included
7
>>> random.randrange(0, 101, 2) # Even integer from 0 to 100
26
>>> random.choice('abcdefghij') # Choose a random element
'c'
>>> items = [1, 2, 3, 4, 5, 6, 7]
>>> random.shuffle(items)
>>> items
[7, 3, 2, 5, 6, 4, 1]
>>> random.sample([1, 2, 3, 4, 5], 3) # Choose 3 elements
[4, 1, 5]
因为我们生成的是字符串和密码,所以我们大概需要random.choice这个函数,函数每次只随机生成其中的一个字符,所以我们大概还需要循环处理一下。
import random
#定义一串用于随机的字符串
str = 'abcdefghijklmnopqrstuvwxyz123456789'
#定义一个空列表,用于将每个随机字符串追加至列表,然后转换成字符串
list_user = []
list_pwd = []
#循环,用户名和密码的长度控制在10位
for i in range(0,10):
list_user.append(random.choice(str))
list_pwd.append(random.choice(str))
#列表转换为字符串
user = "".join(list_user) #user = 7jw863hc8p
pwd = "".join(list_pwd) #pwd = smxxku9jao
字符串生成之后,需要将账户和密码追加到文件中,可能需要文件处理函数
#引入codees模块,使其支持中文
import codecs
file = codecs.open('save_user.txt','w','utf-8')
#将用户名写入,并换行
file.write(u"用户名是%s \n" % (user))
#同上
file.write(u"密码是%s\n" % (pwd))
file.close()
#查看目录,应该已经有文件和文件内容了
作业3
上面的文件中密码没有加密,请将文件内容读取后通过MD5加密后,再保存至另外一个文件
分析
- 首先先将之前保存到文件的内容打开,需要注意如何获取到用户名和密码。
- 将获取到的用户名和密码加密
- 将加密后的内容保存至新的文件
#这次的读取模式为r,表示读取模式
file = codecs.open('save_user.txt','r','utf-8')
#读取一行,内容大约是"用户名是7jw863hc8p"
user_str = file.readline()
pwd_str = file.readline()
#这里获取用户名有多种方法,正则、匹配都行,在这里,简单的用了字符串的分片功能
user = user_str[4:] #7jw863hc8p
pwd = pwd_str[3:] #smxxku9jao
#下面进行md5加密,MD5函数示例
#引入hash模块
import hashlib
#进行MD5 哈希
pwd_md5 = hashlib.md5(pwd).hexdigest() #d71ebedf7b18235147b54465e1eaeb24
#然后重新保存到一个新的文件
file = codecs.open("hash_user.txt",'w','utf-8')
file.write(u"用户名是%s\n" % (user))
file.write(u"加密后的密码是%s\n" % (pwd_md5))
file.close()
作业4
给定一个csv文件,文件内为北京市的公车数据,将其存成字典格式。
文件打开是这样的
需要的格式是这样的{"1(马官营-四惠站)":['马官营','六里桥北里']}
分析
- 之前没有讲使用csv,所以判断可能不是通过csv模块来处理,可能还是通过file函数的readline()和read()函数来处理
- 测试后,发现如果使用readline()来读取所有行,相当不好处理,所以选用read()函数。辅以正则。
流程分解
- 读取文件,并先去除第一行(无用的title),剩下全部的公交信息
- 将剩余文字使用file.read()全部读取到某个变量
- 观察其特征,发现在每次到新的公交站的时候会有一个换行,后面会有个'"'号。使用正则,将剩下的内容按照ID-station拆分
- 新建一个字典,然后以每个列表的第1个(比如1(马官营-四惠站))为索引,最后一个转换成列表后作为值
import codecs
import re
file = codecs.open('beijing_jt.csv','r','utf-8')
#将文件的标题读出,因为这些信息在处理时没有用处
file.read(116)
#将剩下的内容全部放到一个变量
text = file.read()
#按照规则拆分成一列一列的字符串
list = re.split(r'\"\s',text)
#删除最后一个空元素
del(list[2])
#新建一个空字典
dict = {}
for row in list:
#将row格式化成列表,逗号分隔
_l = row.split(',')
key = _l[1] #字典的索引出来了
value = _l[12].split('\n') #字典的值出来了
#dict.update({key,value}) 这种方式会报错,使用下面的方式
dict[key] = value
总结
以上方式是我根据自己的想法而写的一些方案,一个问题可以有很多种答案,只要是能解决问题,都算的上是好方法。
在解决的基础上如果能考虑性能就更佳了。最后一个作业的表格其实有很多数据,这就需要考虑如果在最短的时间内计算出。大家加油吧。