Python高级编程–正则表达式(习题)
原文:http://start2join.me/python-regex-answer-20141030/
###########################################
#########Exercises after Chapter 15th ##########
###########################################
相关学习书籍:《Python核心编程》第十五章——正则表达式习题与答案。
正则表达式相关知识:
章节练习题及答案:
所有程序首行加入引入re模块代码:
import re
#15-1:识别下列字符串:bat、bit、but、hat、hit、或hut。
print('''
#15-1:识别下列字符串:bat、bit、but、hat、hit、或hut。
''')
strList = ['bat', 'bit', 'but', 'hat', 'hit', 'hut']
for c in strList:
print (re.match(r'[bh][aiu]t', c).group())
#15-2:匹配用一个空格分隔的任意一对单词,比如名和姓。
print('''
#15-2:匹配用一个空格分隔的任意一对单词,比如名和姓。
''')
result = re.match(r'[A-Za-z]+\s[A-Za-z]+', 'Jim Green')
print(result.group())
#15-3:匹配用一个逗号和一个空格分开的一个单词和一个字母。例如英文人名中的姓和名的首字母。
print('''
#15-3:匹配用一个逗号和一个空格分开的一个单词和一个字母。
例如英文人名中的姓和名的首字母。
''')
result = re.match(r'([A-Za-z]\.)+?\s[A-Za-z]+', 'J. Green')
print(result.group())
#15-4:匹配所有合法的Python标识符。注:字母下划线打头,后面接任意数字字母和下划线
print('''
#15-4:匹配所有合法的Python标识符。
注:字母下划线打头,后面接任意数字字母和下划线
''')
valueList = ['10_mys', '_myValue09', 'Post99', \
'*hahah', 'list@%']
for c in valueList:
result = re.match(r'[a-zA-Z_][\w_]+$', c)
if result:
print(c+':'+result.group())
else:
print(c+':Illegal...')
#15-6:匹配简单的以www.开头以.com结尾的web域名。例如www.baidu.com。附加题:使你写的表达式还支持其他的顶级域名。如:.edu, .net等。
print('''
#15-6:匹配简单的以www.开头以.com结尾的web域名。例如www.baidu.com。
附加题:使你写的表达式还支持其他的顶级域名。如:.edu, .net等。
''')
comList = ['com', 'edu', 'net']
result = re.match(r'www.\w+.com', 'www.baidu.com')
print(result.group(0))
result = re.match(r'www[.\w]+', 'www.yahoo.net')
if result:
print(result.group(0))
#15-7:匹配全体Python整形的字符串表示形式的集合
print('''
#15-7:匹配全体Python整形的字符串表示形式的集合
''')
result = re.match(r'\d+[Ll]?', '43545464')
print(result.group(0))
#15-8:匹配全体Python长整形的字符串表示形式的集合
print('''
#15-8:匹配全体Python长整形的字符串表示形式的集合
''')
result = re.match(r'\d+[Ll]', '43545464L')
print(result.group(0))
#15-9:匹配全体Python浮点形的字符串表示形式的集合
print('''
#15-9:匹配全体Python浮点形的字符串表示形式的集合
''')
result = re.match(r'\d+\.?\d+', '43545464.00001')
print(result.group(0))
#15-10:匹配全体Python复数形的字符串表示形式的集合
print('''
#15-10:匹配全体Python复数形的字符串表示形式的集合
''')
result = re.match(r'\d+\.?\d+\+\d+\.?\d+j', '4.5+0.1j')
print(result.group(0))
#15-11:匹配所有电子邮件的字符串表示形式的集合
print('''
#15-11:匹配所有电子邮件的字符串表示形式的集合
''')
result = re.match(r'\w+@(\w+\.)*\w+', 'jim@host.cool.com')
print(result.group(0))
#15-12:匹配所有web网站地址的字符串表示形式的集合
print('''
#15-12:匹配所有web网站地址的字符串表示形式的集合
''')
result = re.match(r'\w+(\w+\.)*\w+', 'www.host.cool.com')
print(result.group(0))
#15-13:匹配标准日历上的前9个月
print('''
#15-13:匹配标准日历上的前9个月
''')
result = re.match(r'0?[1-9]', '07')
print(result.group(0))
#15-14:匹配标准日历上的后三个月
print('''
#15-14:匹配标准日历上的后三个月
''')
result = re.match(r'1[0-2]', '11')
print(result.group(0))
#15-15:信用卡问题:15位信用卡的格式是4-6-5。16位的信用卡格式是4-4-4-4,位数不足则添0补充。
print('''
#15-15:信用卡问题:
15位信用卡的格式是4-6-5。
16位的信用卡格式是4-4-4-4,位数不足则添0补充。
''')
cardNo = '1321-1544-6511-0001'
result = re.findall(r'(\d)', cardNo)
if 16 == len(result):
reResult = re.match(r'[\d]{4}-[\d]{4}-[\d]{4}-[\d]{4}', \
cardNo)
if reResult:
print('It is OK!')
else:
print('It is Illegal...')
elif 15 == len(result):
reResult = re.match(r'[\d]{4}-[\d]{6}-[\d]{5}', cardNo)
if reResult:
print('It is OK!')
else:
print('It is Illegal...')
else:
print('It is Illegal...')
#15-16:修改getdata.py,将生成的数据存入redate.txt中。
print('''
#15-16:修改getdata.py,将生成的数据存入redate.txt中。
''')
from random import randint, choice
import string
from time import ctime
lowercase = []
for c in 'abcdefghijklmnopqrstuvwxyz':
lowercase.append(c)
maxint = 23554545646
doms = ('com', 'edu', 'net', 'org', 'gov')
f = open('redata.txt', 'w+')
for i in range(randint(5, 10)):
dtint = randint(0, maxint - 1)
dtstr = ctime(dtint)
shorter = randint(4, 7)
em = ''
for j in range(shorter):
em += choice(lowercase)
longer = randint(shorter, 12)
dn = ''
for j in range(longer):
dn += choice(lowercase)
f.write('%s::%s@%s.%s::%d-%d-%d\n' %
(dtstr, em, dn, choice(doms), \
dtint, shorter, longer))
print('%s::%s@%s.%s::%d-%d-%d' %
(dtstr, em, dn, choice(doms), \
dtint, shorter, longer))
f.close();
#15-17:统计redata.txt中各星期出现的次数。
print('''
#15-17:统计redata.txt中各星期出现的次数。
''')
mon, tue, wed, thu, fri, sat, sun = 0, 0, 0, 0, 0, 0, 0
with open('redata.txt', 'r') as f:
for line in f:
result = re.match(r'^[\w]{3}', line)
if result.group() == 'Mon':
mon += 1
elif result.group() == 'Tue':
tue += 1
elif result.group() == 'Wed':
wed += 1
elif result.group() == 'Thu':
thu += 1
elif result.group() == 'Fri':
fri += 1
elif result.group() == 'Sat':
sat += 1
elif result.group() == 'Sun':
fri += 1
print('%s\t%s\t%s\t%s\t%s\t%s\t%s' \
% ('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'))
print('%d\t%d\t%d\t%d\t%d\t%d\t%d\n' \
% (mon, tue, wed, thu, fri, sat, sun))
f.close()
#15-18:通过正文部分的整形与时间戳进行比较,判断文件是否完整。
print('''
#15-18:通过正文部分的整形与时间戳进行比较,判断文件是否完整。
''')
with open('redata.txt', 'r') as f:
for line in f:
timeStr = re.match(r'.+\s\d{4}', line)
timeInt = re.match(r'.+::(\d+)-', line)
if ctime(int(timeInt.group(1))) != timeStr.group(0):
print(ctime(int(timeInt.group(1))))
print('File is Error...')
break;
#15-19:提取每行中完整的时间戳字段。
print('''
#15-19:提取每行中完整的时间戳字段。
''')
with open('redata.txt', 'r') as f:
for line in f:
timeStr = re.match(r'.+\s\d{4}', line)
print(timeStr.group(0))
#15-20:提取每行中完整的电子邮件字段。
print('''
#15-20:提取每行中完整的电子邮件字段。
''')
with open('redata.txt', 'r') as f:
for line in f:
mailStr = re.match(r'.+::(.+)::', line)
print(mailStr.group(1))
#15-21:只提取每行中的月份。
print('''
#15-21:只提取每行中的月份。
''')
with open('redata.txt', 'r') as f:
for line in f:
mailStr = re.match(r'.+\s([\w]{3})\s', line)
print(mailStr.group(1))
#15-22:只提取每行中的年份。
print('''
#15-22:只提取每行中的年份。
''')
with open('redata.txt', 'r') as f:
for line in f:
mailStr = re.match(r'.+\s([\w]{4})::', line)
print(mailStr.group(1))
#15-23:只提取每行中的时间字段(HH:MM:SS)。
print('''
#15-23:只提取每行中的时间字段(HH:MM:SS)。
''')
with open('redata.txt', 'r') as f:
for line in f:
mailStr = re.match(r'.+\d\s(.+)\s\d', line)
print(mailStr.group(1))
#15-24:只提取电子邮件中登录名和域名(连接提取).
print('''
#15-24:只提取电子邮件中登录名和域名(连接提取).
''')
with open('redata.txt', 'r') as f:
for line in f:
mailStr = re.match(r'.+::(.+)\.', line)
print(mailStr.group(1))
#15-25:只提取电子邮件中登录名和域名(分别提取)。
print('''
#15-25:只提取电子邮件中登录名和域名(分别提取)。
''')
with open('redata.txt', 'r') as f:
for line in f:
nameStr = re.match(r'.+::(\w+)@', line)
zoneStr = re.match(r'.+@(\w+)\.', line)
print(nameStr.group(1) + '-->' + zoneStr.group(1))
#15-26:将每行的电子邮件替换为你自己的电子邮件地址。
print('''
#15-26:将每行的电子邮件替换为你自己的电子邮件地址。
''')
lines = []
with open('redata.txt', 'r') as r:
for line in r:
nameStr = re.sub(r'\w+@\w+\.\w+', \
'cf@host.com', line)
lines.append(nameStr)
with open('redata.txt', 'w+') as w:
for line in lines:
w.write(line)
with open('redata.txt', 'r') as r:
for line in r:
print(line)
#15-27:提取出时间戳中的月日年,并按照’月 日, 年’显示出来(每行只遍历一次)。
print('''
#15-27:提取出时间戳中的月日年,
并按照'月 日, 年'显示出来(每行只遍历一次)。
''')
with open('redata.txt', 'r') as f:
for line in f:
dateStr = \
re.match( \
r'.+\s([\w]{3}[\s]{1,2}[\d]{1,2})\s.+\s(\d+):', \
line)
print(dateStr.group(1) + ', ' + dateStr.group(2))
#15-28:提取电话号码3-3-4,要求区号是可选的(800-555-1212和555-1212都可以匹配)。
print('''
#15-28:提取电话号码3-3-4,要求区号是可选的。
(800-555-1212和555-1212都可以匹配)。
''')
numList = ['800-555-1212', '555-1212']
for nums in numList:
number = re.match(r'(\d{3}-)?\d{3}-\d{4}', nums)
print(number.group())
#15-29:提取电话号码3-3-4,要求区号可以包含园括号或是连字符,他们是可选的(800-555-1212、555-1212或(800)555-1212都可以匹配)。
print('''
#15-29:提取电话号码3-3-4,要求区号可以包含园括号或是连字符,
他们是可选的(800-555-1212、555-1212或(800)555-1212都可以匹配)。
''')
numList = ['800-555-1212', '555-1212', '(800)555-1212']
for nums in numList:
number = \
re.match(r'(\(\d{3}\)|(\d{3}-))?\d{3}-\d{4}', nums)
print(number.group())
Python高级编程–正则表达式(习题)的更多相关文章
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- python高级编程之选择好名称:完
由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- python高级编程之列表推导式
1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...
- Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍
原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...
- Python高级编程-Python一切皆对象
Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...
随机推荐
- Ubuntu上安装zsh
先安装zsh,同时移除之前可能的oh-my-zsh的安装 sudo apt-get install zsh if [ -d ~/.oh-my-zsh ]; then rm -r ~/.oh-my-zs ...
- Strider安装(Ubuntu)
安装: git clone https://github.com/Strider-CD/strider.git && cd strider nam install 然而还是出现一大波错 ...
- mysql基础知识(4)--修改
修改表: 一般概述 通常,创建一个表,能搞定(做到)的事情,修改表也能做到.大体来说,就可以做到: 增删改字段: 增:alter table 表名 add [column] 字段名 字段类 ...
- 2016 CCPC 杭州站 小结
5题倒数第一,铜……(我就知道我们很稳!!!哼!! 这一次心态完全爆炸 开场我就没有按照平时的顺序读题 然后zr的A题wa 我F题T xl说B是一个最小生成树,又说是最小树形图,不会写 K题完全没思路 ...
- cocos2d-x3.2下获取文件夹下所有文件名的方法
这里提供一个函数获取文件夹下所有文件名的方法,直接上代码了. 原文地址:http://blog.csdn.net/qqmcy/article/details/36184733 // // Visib ...
- 使用CXF发布WebService服务简单实例
一.说明: 前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF Apache CXF = Celtix + XFir ...
- HDU 5862 Counting Intersections (树状数组)
Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...
- C++11对象构造的改良
[C++11对象构造的改良] C++03中一个构造函数无法构造另一个构造函数,因为A()实际上意味着生成一个临时对象,存在语音混淆.详情请看参考2. C++11中允许直接在初始化列表中调用其它的构造函 ...
- HTTP中缓存相关
1.客户端如何区分缓存命中和未命中 两种情况下,返回的状态码都是200,客户端有一个方法可以判断,就是使用Date首部,将Date首部与当前时间进行比较,如果响应中时间日期值比较早,客户端可以认为这是 ...
- jgroups 常见概念
组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接. 单播(Unicast)传输:在发送者和每一接收者之间实现点对点网络连接. 广播(Broadcast)传输:是指在IP子网 ...