正则表达式章节15-16到15-29答案
15-16 修改脚本gendata.py 的代码,使数据直接写入文件redata.txt 中,而不是输出到屏幕上。
. 运行命令: python genedata.py > redata.txt 运行genedata.py,生成测试数据,并存储到redata.txt文件中
附上genedata.py代码:
#创建测试数据redata.txt #generate random data from random import randint, choice from string import lowercase from sys import maxint from time import ctime doms = ('com','edu','net','org','gov') for i in range(randint(5,10)): dtint = randint(0, maxint-1) #pick date dtstr = ctime(dtint) #date string shorter = randint(4, 7) #login shorter em = '' for j in range(shorter): # genarate login em += choice(lowercase) longer = randint(shorter, 12) # domain longer dn = '' for j in range(longer): #create domain dn += choice(lowercase) print '%s::%s@%s.%s::%d-%d-%d' % (dtstr, em, dn, choice(doms), dtint, shorter, longer)
15-17. 统计生成的redata.txt 文件中,星期中的每一天出现的次数(或统计各月份出现的次数)。
#统计星期中的每一天出现的次数 import re week = {"Mon":0, "Tue":0, "Wed":0, "Thu":0, "Fri":0, "Sat":0, "Sun":0} #open the data file and read data file = open('redata.txt') data = file.readlines() for line in data: day = re.match('^\w{3}', line) key = day.group() week[key] = week[key]+1 for i in week: print i, week[i]
#统计各月份出现的次数 import re year = {"Jan":0, "Feb":0, "Mar":0, "Apr":0, "May":0,"Jun":0, "July":0, "Aug":0, "Sep":0, "Oct":0, "Nov":0, "Dec":0} #open the data file and read data file = open('redata.txt') data = file.readlines() for line in data: day = re.match('^\w{3}\s(\w{3})', line) key = day.group(1) year[key] = year[key]+1 print key for i in year: print i, year[i]
15-19 提取出每行中完整的时间戳字段。
15–20. 提取出每行中完整的电子邮件地址。
15–21. 只提取出时间戳字段中的月份。
15-22. 只提取出时间戳字段中的年份。
15–23. 只提取出时间戳字段中的值(格式:HH:MM:SS)。
15-24. 只从电子邮件地址中提取出登录名和域名(包括主域名和顶级域名,二者连在一起)。
15-25. 只从电子邮件地址中提取出登录名和域名(包括主域名和顶级域名,二者分别提取)。
#19-25题答案 import re #open the data file and read data file = open('redata.txt') data = file.readlines() for line in data: str = re.split("::", line) time = str[0] email =str[1] login = email.split('@')[0] website = email.split('@')[1] first = website.split('.')[0] second = website.split('.')[1] pt = '\w{3}\s(\w{3})\s\d{2}\s(.{8})\s(\d{4})' m = re.match(pt, time) month = m.group(1) stamp = m.group(2) year = m.group(3) print month, year, stamp, login, website, first, second
15–28.区号(第一组的三个数字和它后面的连字符)是可选的,即,你写的正则表达式对800-555-1212 和555-1212 都可以匹配。
15–29.区号中可以包含圆括号或是连字符,而且它们是可选的,就是说你写的正则表达式可以匹配800-555-1212, 或 555-1212, 或(800) 555-1212.
#28,29题答案,把下面代码存储到.py文件中运行即可 import re pt1 = '((\d{3}-)|(\(\d{3}\)\s))?\d{3}-\d{4}' print re.match(pt1,'800-555-1212').group() print re.match(pt1,'555-1212').group() print re.match(pt1,'(800) 555-1212').group()