您的位置:首页 > 编程语言 > Python开发

Python核心编程第15章正则表达式练习答案

2012-10-09 10:54 183 查看
#15-1 识别下列字符串:“bat,” “bit,” “but,” “hat,” “hit,” 或 “hut”

pattern =  r'[bh][aiu]t,?'

#15-2  匹配用一个空格分隔的任意一对单词,比如,名和姓

pattern = r'\b\w+ \w+\b'

#15-3  匹配用一个逗号和一个空格分开的一个单词和一个字母。例如,英文人名中的姓和名的首字母

pattern = r'\b\w+, \w'

#15-4  匹配所有合法的 Python 标识符

pattern = r'\b[a-zA-Z_](\w|_)*\b'

#15-5 匹配地址

 

#15-6  匹配简单的以“www.”开头,以“.com”作结尾的 Web 域名,例如:www.yahoo.com. 

#附加题:使你写的正则表达式还支持其他顶级域名:.edu, .net 等,比如:www.ucsc.edu

pattern = r'\bwww\..*\.(com|net|edu)'

#15-7 15-8 匹配全体Python长整数的字符串表示形式的集合

patternIntStr = r'''

^ #从字符串开始位置匹配

(\+|-)? #可选的正负号

(

(0|[1-9]\d*)#十进制整数,0或非0

|

(0[0-7]*) #八进制整数

|

(0[xX][0-9a-fA-F]+) #十六进制整数

)

$ #匹配到字符串的结束位置

'''

#15-9 匹配全体Python浮点数的字符串表示形式的集合

patternFloatStr = r'''

^ #从字符串开始位置匹配

(\+|-)? #可选的正负号

(

\d+\.\d* #匹配 1. 1.0 等形式,即小数部分可省略

|

\d*\.\d+ #匹配 .1 0.1 等形式,即整数部分可省略

)

((e|E)(\+|-)?\d+)? #可选的科学计数法

$ #匹配到字符串的结束位置

'''

#15-10 匹配全体Python复数的字符串表示形式的集合

patternComplexStr = r'''

^ #从字符串开始位置匹配

(

(\+|-)? #可选的正负号

(

\d+\.?\d* #匹配 1. 1.0 1等形式,即小数部分和小数点可省略

|

\d*\.?\d+ #匹配 .1 0.1 1 等形式,即整数部分和小数点可省略

)

((e|E)(\+|-)?\d+)? #可选的科学计数法

)

{1,2} #匹配实数和虚数

(j|J) #虚数标识

$ #匹配到字符串的结束位置

'''

#15-11 匹配所有合法的电子邮件地址

patternEmailStr = r'''

^

[a-zA-Z] #以字母开头

(\w|_|\.)* #用户名只允许有字母、数字、下划线、点(.)

@

(\w|\.)+ #域名包括字母、数字、点(.)

$

'''

#15-12 匹配所有合法的web网站地址

patternURL = r'''

^

\.+

$

'''

#15-13 提取类型名字

patternType = r'''

'

(\w+)

'

'''

#15-14 匹配月份:1 2 3 4 01 02 10 11 12等

patternMonth = r'''

^

(0?[1-9]|1[0-2])

$

'''

#15-15 匹配信用卡卡号

creditPattern = r'''

^

\d{4}

-

(\d{6}-\d{0,5}

|

\d{4}-\d{4}-\d{0,4})

$

'''

#15-17 统计星期中的每一天出现的次数

def analyseWeekdayCount(fileObj):
weekdayPattern = re.compile(r'\b(Sun|Mon|Tue|Wed|Thu|Fri|Sat)\b')
weekdays = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')
weekdayCnt = dict()
for weekday in weekdays:
weekdayCnt[weekday] = 0
while True:
line = fileObj.readline()
if line:
match = weekdayPattern.search(line)
print match.group()
weekdayCnt[match.group()] += 1
else:
break
print '\n'.join(['%s: %d' %(k, v) for k, v in weekdayCnt.items()])

#统计各月份出现的次数

def analyseMonthCount(fileObj):
monthPattern = re.compile(r'\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b')
months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 
'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
monthCnt = dict()
for month in months:
monthCnt[month] = 0
while True:
line = fileObj.readline()
if line:
match = monthPattern.search(line)
print match.group()
monthCnt[match.group()] += 1
else:
break
print '\n'.join(['%s: %d' %(k, v) for k, v in monthCnt.items()])

#15-19 提取每行中完整的时间戳字段

def extractTimestamp(fileObj):
timestampPattern = re.compile(r'\w{3} \w{3} \d\d \d\d:\d\d:\d\d \d{4}')
while True:
line = fileObj.readline()
if line:
match = timestampPattern.match(line)
print match.group()
else:
break

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

def extractEMailAddr(fileObj):
EMailAddrPattern = re.compile(r'::([a-z]+@[a-z]+\.[a-z]+)::')
while True:
line = fileObj.readline()
if line:
match = EMailAddrPattern.search(line)
print match.group(1)
else:
break

#15-21 提取时间戳中的月份

def extractMonth(fileObj):
monthPattern = re.compile(r'\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b')
while True:
line = fileObj.readline()
if line:
match = monthPattern.search(line)
print match.group(1)
else:
break

#15-22 提取时间戳中的年份

def extractYear(fileObj):
yearPattern = re.compile(r'\b(\d{4})::')
while True:
line = fileObj.readline()
if line:
match = yearPattern.search(line)
print match.group(1)
else:
break

#15-23 提取时间戳中的时间

def extractTime(fileObj):
timePattern = re.compile(r'\b(\d\d:\d\d:\d\d)\b')
while True:
line = fileObj.readline()
if line:
match = timePattern.search(line)
print match.group(1)
else:
break

#15-24  只从电子邮件地址中提取出登录名和域名(包括主域名和顶级域名,二者连在一起)

def joinLoginNameAndDomainName(fileObj):
EMailAddrPattern = re.compile(r'::([a-z]+)@([a-z]+\.[a-z]+)::')
while True:
line = fileObj.readline()
if line:
match = EMailAddrPattern.search(line)
print ''.join([match.group(1), match.group(2)])
else:
break

#15-25  只从电子邮件地址中提取出登录名和域名(包括主域名和顶级域名,二者分别提取)

def splitLoginNameAndDomainName(fileObj):
EMailAddrPattern = re.compile(r'::([a-z]+)@([a-z]+\.[a-z]+)::')
while True:
line = fileObj.readline()
if line:
match = EMailAddrPattern.search(line)
print ' '.join([match.group(1), match.group(2)])
else:
break

#15–26 将每行中的电子邮件地址替换为你自己的电子邮件地址

def replaceEMailAddr(fileObj):
myAddr = r'iamzhaiwei@yahoo.cn'
EMailAddrPattern = re.compile(r'[a-z]+@[a-z]+\.[a-z]+')
while True:
line = fileObj.readline()
if line:
match = EMailAddrPattern.sub(myAddr, line)
print match,
else:
break

#15–27 提取出时间戳中的月、日、年,并按照格式“月 日,年”显示出来,且每行仅遍历一次

def extractDate(fileObj):
#datePattern = re.compile(r'\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d\d) .{8} (\d{4})::')
datePattern = re.compile(r'\b([A-Z][a-z]{2} \d\d) .{8} (\d{4})::')
while True:
line = fileObj.readline()
if line:
match = datePattern.search(line)
print '%s, %s' %(match.group(1), match.group(2))
else:
break

#15–28 15-29 电话号码允许包含可选的区号前缀 : \d{3}-\d{3}-\d{4}

#区号中可以包含圆括号或是连字符,而且它们是可选的,就是说你写的正则表达式可以

#匹配 800-555-1212, 或 555-1212, 或(800) 555-1212

phonePatternStr = r'''

^

(\d{3}- #区号中包括连字符

|

\(\d{3}\)\ ) #区号中包括圆括号

? #区号是可选的

\d{3}-\d{4}

$

'''
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息