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

#练习1
#识别后续的字符串:“bat”、“bit”、“but”、“hat”、“hit”或者“hut”。

import re

patt='[bh][aiu]t'
m=re.search(patt,'mybat')
print(m.group())

#练习2
#匹配由单个空格分隔的任意单词对,也就是姓和名。

import re
patt='\w+\s\w+'

m=re.match(patt,'Simon Aids')
print(m.group())

#练习3
#匹配由单个逗号和单个空白符分隔的任何单词和单个字母,如姓氏的首字母

import re

patt=r'\w+,\s+\w+'
m=re.match(patt,'Simon, Aids')
print(m.group())

patt1=r'(\w\.)+ ?(\w)+'
m=re.match(patt1,'S.N.M')
print(m.group())

#练习4
#匹配所有有效Python 标识符的集合。
#1.python中的标识符是区分大小写的。
#2.标示符以字母或下划线开头,可包括字母,下划线和数字。
#3.以下划线开头的标识符是有特殊意义的。

import re
patt=r'_*[A-Za-z]\w+_*'
m=re.match(patt,'_and')

print(m.group())

#练习5
#匹配街道地址,例如,美国街道地址使用如下格式:1180 Bordeaux Drive。
#使你的正则表达式足够灵活,以支持多单词的街道名称,如3120 De la Cruz Boulevard。

import re
patt=r'\d+ (\w+ )+\w+' #'\d+(\s\w+)+'
m=re.match(patt,'3120 De la Cruz Boulevard')
print(m.group())

#练习6
#匹配以“www”起始且以“.com”结尾的简单Web 域名

import re

patt=r'^(w{3})://.+com/?$'
patt1=r'^\w{3,4}://.+(com|edu|net)/?$'
m=re.match(patt1,'www://www. yahoo.com/')
print(m.group())

#示例7
#匹配所有能够表示Python 整数的字符串集
#既可以表示正整数也可以表示正整数

import re
patt=r'-?\d+'
m=re.match(patt,'-1256')
print(m.group())

#示例8
#匹配所有能够表示Python 长整数的字符串集

import re

patt=r'\d+[Ll]'
m=re.match(patt,'100L')
print(m.group())

#示例9
#匹配所有能够表示Python 浮点数的字符串集

import re
patt=r'\d+\.?\d*'
m=re.match(patt,'1.737678')
print(m.group())

#示例10
#匹配所有能够表示Python 复数的字符串集

import re
patt=r'(\d+\.?\d*)?\+?(\d+\.?\d*)?i?'
m=re.match(patt,'5.6i')
print(m.group())

#示例11
#匹配所有能够表示有效电子邮件地址的集合

#有效电子邮件地址:用户名,可以自己选择。
#由字母、数字、点、减号或下划线组成。只能以数字或字母开头和结尾。

import re
patt=r'\w+[\w\.-_]*\w+@(\w+\.)*\w+'
m=re.match(patt,'[email protected]')
print(m.group())

#示例12
#匹配所有能够表示有效的网站地址的集合

import re

patt=r'(\w{3,5})://(\w+\.)+\w+'
m=re.match(patt,'https://www.sogou.com')
print(m.group())

#示例13
#创建一个能够从字符串中提取实际类型名称的正则表达式

#type()。内置函数type()返回一个类型对象
#>>> type(0)
#>>> type(.34)

import re

patt=r'class\s\'(.+)\''
m=re.search(patt,'')
print(m.group(1))

#示例14
#处理日期,创建一个正则表达式来表示标准日历中剩余三个月的数字

import re
patt=r'1[0-2]'

#示例15
#处理信用卡号码
#创建一个允许使用连字符的正则表达式。
#15 位的信用卡号码使用4-6-5 的模式,表明4 个数字-连字符-6 个数字-连字符-5 个数字;
#16 位的信用卡号码使用4-4-4-4 的模式

import re
patt=r'((\d{4}-){3}\d{4})|(\d{4}-\d{6}-\d{5})'
patt1=r'\d{4}-(\d{4}|\d{6})-\d{4,5}(-\d{4})?'
m=re.match(patt1,'1111-222233-33334')
print(m.group())

#示例17
#判断在redata.tex 中一周的每一天出现的次数

import re
import os

dict1={'Mon':0,'Tue':0,'Wes':0,'Thu':0,'Fri':0,'Sat':0,'Sun':0}

f=open('redata.txt','r')
for eachline in f:
    m=re.match(r'Mon|Tue|Wes|Thu|Fri|Sat|Sun',eachline.strip())
    print(m.group())
    dict1[m.group()]=dict1.get(m.group(),0)+1
print(dict1)
f.close()

#示例19
#提取每行中完整的时间戳。

import re
import os
f=open('redata.txt','r')
for eachline in f:
    m=re.match(r'\w{3} \w{3} \d+ \d{2}:\d{2}:\d{2} \d{4}',eachline.strip())
    print(m.group())

f.close()

#示例20
#提取每行中完整的电子邮件地址

import re
import os

f=open('redata.txt','r')
for eachline in f:
    m=re.search(r'\w+@\w+\.\w+',eachline.strip())
    n=re.search(r'::(.+)::',eachline.strip())
    print(m.group())
    print(n.group(1))
f.close()

#示例21
#仅仅提取时间戳中的月份。

import re
import os

f=open('redata.txt','r')
for eachline in f:
    m=re.match(r'\w{3} \w+ (\d+)',eachline.strip())
    print(m.group(1))

f.close()

#示例22
#仅仅提取时间戳中的年份

import re
import os

f=open('redata.txt','r')
for eachline in f:
    m=re.search(r' (\d{4})::',eachline.strip())
    print(m.group(1))
f.close()

#示例23
#仅仅提取时间戳中的时间(HH:MM:SS)。

import re
import os

f=open('redata.txt','r')
for eachline in f:
    m=re.search(r'\d{2}:\d{2}:\d{2}',eachline.strip())
    print(m.group())

f.close()

#示例24
#仅仅从电子邮件地址中提取登录名和域名

import re
import os

f=open('redata.txt','r')
for eachline in f:
    m=re.search(r'::(\w+)@(\w+\.\w+)::',eachline.strip())
    print(m.group(1))
    print(m.group(2))

f.close()

#示例25
#仅仅从电子邮件地址中提取登录名和域名(包括主域名和高级域名)。

import re
import os

f=open('redata.txt','r')
for eachline in f:
    m=re.search(r'::(\w+)@(\w+)\.(\w+)::',eachline.strip())
    print(m.group(1))
    print(m.group(2))
    print(m.group(3))
f.close()

#示例26
#使用你的电子邮件地址替换每一行数据中的电子邮件地址

import re
import os

f=open('redata.txt','r')
for eachline in f:
    m=re.sub(r'\w+@\w+\.\w+','[email protected]',eachline)
    print(m)

f.close()

#示例27
#从时间戳中提取月、日和年,然后以“月,日,年”的格式,每一行仅仅迭代一次。

import re
import os

f=open('redata.txt','r')
for eachline in f:
    m=re.sub(r'(\w{3}) (\d+) (.+) (\d+)',r'\1,\2,\4 \3',eachline.strip())
    print(m)

f.close()

#示例28
#区号(三个整数集合中的第一部分和后面的连字符)是可选的
#匹配800-555-1212,也能匹配555-1212

import re

m=re.match(r'(\d{3}-)?\d{3}-\d{3}','800-222-555')
print(m.group())

#示例29
#支持使用圆括号或者连字符连接的区号
#匹配800-555-1212、555-1212 以及(800)555-1212

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

你可能感兴趣的:(Python)