python 核心编程 正则表达式部分答案

正则表达式章节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()



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值