Python核心编程(第三版)第一章答案
- 1.1 识别后续字符串
- 1.2 匹配由单个空格分隔的任意单词对,也就是姓和名
- 1.3 匹配由单个逗号和单个空白符分隔的任意单词和单个字母,如姓氏的首字母
- 1.4 匹配所有有效python标识符的集合
- 1.5 匹配街道地址
- 1.6 匹配以www起始且高级域名结尾的简单域名
- 1.7 匹配python整数
- 1.8 匹配python长整数
- 1.9 匹配浮点数
- 1.10 匹配python复数
- 1.11 匹配电子邮件地址集合
- 1.12 匹配URL
- 1.13 type()。创建一个能够从字符串中提取实际类型名称的正则表达式。
- 1.14 匹配标准日历中9月之后三个月数字
- 1.15 处理信用卡号码
- 1.16 更新gendata.py代码
- 1.17 判断在redata.txt文件中一周的每一天出现的次数
- 1.18 通过确认整数字段中的地一个整数匹配在每个输出行起始部分的时间戳,确保在redata.txt文件中没有数据损坏
- 1.19~1.27
- 1.28 区号是可选的,匹配800-555-1212,也能匹配555-1212
- 1.29 支持园括号或者连字符连接的区号
环境: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())