Python核心编程(第三版)第一章答案

环境:linux python 3.7.3

1.1~1.12仅要求写正则表达式

1.1 识别后续字符串

[hb][aiu]t

1.2 匹配由单个空格分隔的任意单词对,也就是姓和名

[a-zA-Z]+ [a-zA-Z]+
注意,这里不能直接用\w,\w包括数字

1.3 匹配由单个逗号和单个空白符分隔的任意单词和单个字母,如姓氏的首字母

[a-zA-Z]+, [a-zA-Z]

1.4 匹配所有有效python标识符的集合

^[a-zA-Z_][\w_]+

1.5 匹配街道地址

[\u4E00-\u9FA5]+\d+号

这里匹配的中文

1.6 匹配以www起始且高级域名结尾的简单域名

www.\w+.com|edu|net

1.7 匹配python整数

\d+

1.8 匹配python长整数

python3中并没有python2中的long类型,默认int当作long,根据书后答案本地结果为\d+[1L]

1.9 匹配浮点数

\d+(.\d*)?

1.10 匹配python复数

\d+(.\d*)?+\d+(.\d*)?[jJ]

1.11 匹配电子邮件地址集合

^[\w][\w_\+-]+@\w+.([\w]+.)?com

1.12 匹配URL

^[a-zA-Z]+://[a-zA-Z]+.[\w]+.[a-zA-Z]+(:\d+)?/[\w-]+/+([\w./]+)? 

1.13 type()。创建一个能够从字符串中提取实际类型名称的正则表达式。

re.match('<class \'(\w+)\'>',str(type('***'))).group(1)

提取了不带符号的类型字符串

1.14 匹配标准日历中9月之后三个月数字

re.match('1[012]','12').group()

1.15 处理信用卡号码

信用卡处理规则

https://bbs.csdn.net/topics/10166772?list=233884

#!/usr/bin/env python
# -*- coding:utf8 -*-

import re 

cc = '1234567894987654'
if (len(cc)!=15 and len(cc)!=16):
    print('ERROR1')
else:
    ccq=[]
    for i in range(0,len(cc),2):
        ccq.append(cc[i])
    ccount = 0
    for i in range(len(ccq)):
        if int(ccq[i])*2>9:
            ccount=ccount+(int(ccq[i])*2-9)
        else:
            ccount=ccount+(int(ccq[i])*2)
        ccount=ccount+int(cc[2*i+1])
    if ccount%10!=0:
        print('ERROR2')
    else:
        if len(cc)==15:
            m=re.match('(\d{4})(\d{6})(\d{5})',cc)
            print(m.group(1)+'-'+m.group(2)+'-'+m.group(3))
        else:
            m=re.match('(\d{4})(\d{4})(\d{4})(\d{4})',cc)
            print(m.group(1)+'-'+m.group(2)+'-'+m.group(3)+'-'+m.group(4))

1.16 更新gendata.py代码

#!/usr/bin/env python
# -*- coding:utf8 -*-

from random import randrange, choice,random
from string import ascii_lowercase as lc
from sys import maxsize
from time import ctime

tlds = ('com','edu','net','org','gov')

for i in range(randrange(5,11)):
    dtint = randrange(2**30)       #pick date
    dtstr = ctime(dtint)            #date string
    llen = randrange(4,8)           #login is shorter
    login = ''.join(choice(lc) for j in range(llen))
    dlen = randrange(llen,13)       #domain is longer
    dom = ''.join(choice(lc) for j in range(dlen))
    print('%s::%s@%s.%s::%d-%d-%d' % (dtstr,login,dom,choice(tlds),dtint,llen,dlen))
    f=open('redata.txt','a')
    f.write('%s::%s@%s.%s::%d-%d-%d\n' % (dtstr,login,dom,choice(tlds),dtint,llen,dlen))
    f.close()

1.17 判断在redata.txt文件中一周的每一天出现的次数

import numpy
import re
f=open('redata.txt','r')
lines = f.readlines()
week_day = [['Mon',0] for i in range(7)]
j = 0
for i in range(len(lines)):
    sign = 0
    if re.match('^\w{3}',lines[i]).group() == 'Mon':
        week_day[0][1]=week_day[0][1]+1
    else :
        for n in range(j+1):
            if re.match('^\w{3}',lines[i]).group() == week_day[n][0]:
                week_day[n][1] = week_day[n][1]+1
                sign = 1
                break
        if sign == 0:
            j = j+1
            week_day[j][0] = re.match('^\w{3}',lines[i]).group()
            week_day[j][1] = 1
    print(i,j,week_day)
print(week_day)

1.18 通过确认整数字段中的地一个整数匹配在每个输出行起始部分的时间戳,确保在redata.txt文件中没有数据损坏

import re
import time

f = open('redata.txt','r')
lines = f.readlines()
for i in range(len(lines)):
    ts = re.search('::(\d+)-',lines[i]).group(1)
    ct = re.search('(^.+?)::',lines[i]).group(1)
    print(ct)
    print(time.ctime(int(ts)))
    if ct == time.ctime(int(ts)):
        print(str(i)+': True')
    else:
        print(str(i)+': False')

1.19~1.27

import re

f = open('redata.txt','r')
lines = f.readlines()
for i in range(len(lines)):
    ts = re.match('(^.+?)::',lines[i]).group(1) #时间戳
    print(ts)
    email = re.search('\w+@\w+.\w+',lines[i]).group() #电子邮件
    print(email)
    month = re.search('\w{3} (\w{3})',lines[i]).group(1) #时间戳中的月份
    print(month)
    year = re.search(' (\d{4}):',lines[i]).group(1)# 年份
    print(year)
    tm = re.search('\d{2}:\d{2}:\d{2}',lines[1]).group()# 时间
    print(tm)
    name1 = re.search('(\w+)@(\w+.\w+)',lines[i]).group(1,2)#登录名和域名
    print(name1)
    name2 = re.search('(\w+)@(\w+)\.(\w+)',lines[i]).group(1,2,3)#登录名,主域名和高级域名
    print(name2)
    nmail = re.sub('\w+@\w+.\w+','xx@xxx.xx',lines[i]).strip()#邮箱替换
    print(nmail)
    nts = re.sub('(\w{3}) (\d{1,2}) (.+) (\d{4})',r'\1,\2,\4 \3',lines[i]).strip()#修改日期格式
    print(nts)
    print()

1.28 区号是可选的,匹配800-555-1212,也能匹配555-1212

import re
o = re.match('(\d{3}-)?\d{3}-\d{4}','800-555-1212')
print(o.group())
o = re.match('(\d{3}-)?\d{3}-\d{4}','555-1212')
print(o.group())

1.29 支持园括号或者连字符连接的区号

import re
m = re.match('(\(?\d{3}[ \)-])? ?\d{3}-\d{4}','(800) 555-1212')
print(m.group())
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值