Python核心编程 课后习题

第一部分 正则表达式

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

In [3]:
import re
data = 'bat sad bit ad but d fa hat adfad hit ad da d hut aa'
patt = '[bh][uia]t'
m = re.findall(patt,data)
print(m)

['bat', 'bit', 'but', 'hat', 'hit', 'hut']

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

In [75]:
data = 'adfass323f sadfa aadfa'
patt = '\w+\s\w+'
m = re.match(patt, data)
m.group()

Out[75]:
'adfass323f sadfa'

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

In [82]:
data = 'adfaf  aa, dadada'
patt = '\w+,\s\w+'
m = re.search(patt, data)
m.group()

Out[82]:
'aa, dadada'

1-4 匹配所有有效 Python 标识符的集合。

In [108]:
data = 'adaas1212dfdfsadfaaf_'
patt = '[_A-Za-z]+[_\w]+'   #有效Python标识符:以下划线和字母开头的非空字符,
m = re.match(patt, data)
m.group()

Out[108]:
'adaas1212dfdfsadfaaf_'

1-5 根据读者当地的格式,匹配街道地址(使你的正则表达式足够通用,来匹配任意数量的街道单词,包括类型名称)。例如,美国街道地址使用如下格式:1180 Bordeaux Drive。使你的正则表达式足够灵活,以支持多单词的街道名称,如 3120 De la Cruz Boulevard。

In [119]:
data = '3120 De la Cruz Bou levard'
patt = r'\d+.+'     #以数字开头的任何字符串
m = re.match(patt,data)
m.group()

Out[119]:
'3120 De la Cruz Bou levard'

1-6 匹配以“www”起始且以“.com”结尾的简单Web 域名;例如,www://www. yahoo.com/。选做题:你的正则表达式也可以支持其他高级域名,如.edu、.net 等(例如,http://www.foothill.edu)。

In [236]:
data = 'http://www.y.as.sadf.a121.2asasdoo.cc'
patt = r'http://(www\.[\w|\.]+\.(com|cn|org|net|cc))'
m = re.match(patt,data)
m.group(1)

Out[236]:
'www.y.as.sadf.a121.2asasdoo.cc'

1-7 匹配所有能够表示 Python 整数的字符串集。

In [262]:
data = '-123141234'
patt = '[-|+]?\d+$'
m = re.match(patt, data)
m.group()

Out[262]:
'-123141234'

1-8 匹配所有能够表示 Python 长整数的字符串集。

In [264]:
data = '123141234L'
patt = '[-|+]?\d+[lL]'
m = re.match(patt, data)
m.group()

Out[264]:
'123141234L'

1-9 匹配所有能够表示 Python 浮点数的字符串集。

In [272]:
data = '-12310.09'
patt = '[-|+]?\d+\.\d*'
m = re.match(patt, data)
m.group()

Out[272]:
'-12310.09'

1-10 匹配所有能够表示 Python 复数的字符串集。

In [277]:
data = '121+989i'
patt = r'\d+(\+\d*i)'   #简单的实部和虚部都是整数
m = re.match(patt, data)
m.group()

Out[277]:
'121+989i'

1-11 匹配所有能够表示有效电子邮件地址的集合(从一个宽松的正则表达式开始,然后尝试使它尽可能严谨,不过要保持正确的功能)。

In [75]:
data = 'y.1-a-9.a@t.w-0.9-3-c.com'
patt = r'[a-zA-Z]+([-\.]?\w+)+@((\w+-?\w*)+\.)+\w{2,3}'   #6~18个字符,可使用字母、数字、下划线,需以字母开头
m = re.match(patt, data)
m.group()

Out[75]:
'y.1-a-9.a@t.w-0.9-3-c.com'

1-12 匹配所有能够表示有效的网站地址的集合(URL) (从一个宽松的正则表达式开始,然后尝试使它尽可能严谨,不过要保持正确的功能)。

In [93]:
data = 'http://www.ba-i.du.com.cn http://ww.qq.com'
patt = r'http://((\w+[-\.])*\w+)'
m = re.match(patt, data).group()
n = re.findall(patt, data)
print(n)
      

[('www.ba-i.du.com.cn', 'com.'), ('ww.qq.com', 'qq.')]

1-13 type()。内置函数 type()返回一个类型对象,如下所示,

该对象将表示为一个 Pythonic类型的字符串。
>>> type(0)
<type 'int'>
>>> type(.34)
<type 'float'>
>>> type(dir)
<type 'builtin_function_or_method'>
创建一个能够从字符串中提取实际类型名称的正则表达式。函数将对类似于<type'int' >的字符串返回 int(其他类型也是如此,如 'float' 、'builtin_function_or_method' 等)。
注意:你所实现的值将存入类和一些内置类型的__name__属性中。

In [104]:
data = type(.34)
print(data)
type(0)

<class 'float'>

Out[104]:
int

In [125]:
import re
data = "type 'int' type 'float'"
patt = r'type \'(\w+)\''
m = re.findall(patt, data)
m

Out[125]:
['int', 'float']

1-14 处理日期。1.2 节提供了来匹配单个或者两个数字字符串的正则表达式模式,来表示1~9 的月份(0?[1-9])。创建一个正则表达式来表示标准日历中剩余三个月的数字。

In [118]:
date = '10 11 12  09'
patt = '1\d'
m = re.findall(patt,date)
m

Out[118]:
['10', '11', '12']

1-15 处理信用卡号码。1.2 节还提供了一个能够匹配信用卡(CC)号码([0-9]{15,16})的正则表达式模式。然而,该模式不允许使用连字符来分割数字块。创建一个允许使用连字符的正则表达式,但是仅能用于正确的位置。例如,15 位的信用卡号码使用 4-6-5 的模式,表明 4 个数字-连字符-6 个数字-连字符-5 个数字;16 位的信用卡号码使用 4-4-4-4 的模式。记住,要对整个字符串进行合适的分组。选做题:有一个判断信用卡号码是否有效的标准算法。编写一些代码,这些代码不但能够识别具有正确格式的号码,而且能够识别有效的信用卡号码。

In [137]:
data = '1111-111111-11111'
data2 = '1111-1111-1111-1111'
patt = r'\d{4}-\d{4}(\d{2})?-\d{4}\d?(-\d{4})?'
m = re.match(patt, data)
m.group()

Out[137]:
'1111-111111-11111'

In [12]:
import re
data = '1111-111111-11111'
data2 = '1111-1111-1111-1111'
patt = r'\d{4}-(\d{4}(\d{2})?)-(\d{4}\d?)(-\d{4})?'
m = re.match(patt, data2)
if m == None:
    print('Error')
elif len(m.group(1))==6 and len(m.group(3))==5:
    print('Yes, It is 465')
elif len(m.group(1))==4 and len(m.group(3))==4:
    print('Yes, it is 4444')
else:
    print('No')

Yes, it is 4444

In [30]:
#!/usr/bin/env python
#gendata.py
from random import randrange, choice
from string import ascii_lowercase as lc
#from sys import int
from time import ctime
tlds = ('com', 'edu', 'net', 'org', 'gov')
for i in range(randrange(5,11)):
    dtint = randrange(2**32)   #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))

Mon May 11 05:53:50 1981::pjtf@lqhklujz.edu::358379630-4-8
Mon Mar 14 12:54:36 2089::bkucdxr@ozypualw.edu::3761614476-7-8
Sat Apr 18 07:56:58 2043::aothxkd@vpyrdhb.edu::2312927818-7-7
Sun Mar  2 03:00:18 2025::lehjbwe@xfstllxouzx.net::1740855618-7-11
Fri Jul  6 11:51:49 2063::jneswg@bgfyknkxshg.com::2950919509-6-11
Fri Dec  7 09:25:45 2040::coejb@tmknvw.gov::2238456345-5-6
Sat Apr 28 13:21:13 2091::ajummm@tpxrzyav.net::3828576073-6-8
Thu Oct  6 04:48:41 2011::aqjgy@xlbduwhrtn.com::1317847721-5-10
Tue Oct 16 21:14:24 2057::mfqbo@hlvprgl.gov::2770463664-5-7

1-16 为 gendata.py 更新代码,使数据直接输出到 redata.txt 而不是屏幕。

In [28]:
#!/usr/bin/env python
#gendata.py
from random import randrange, choice
from string import ascii_lowercase as lc
#from sys import int
from time import ctime
tlds = ('com', 'edu', 'net', 'org', 'gov')
f = open('redata.txt','w')
for i in range(randrange(5,11)):
    dtint = randrange(2**32)   #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)) 
    data = '%s::%s@%s.%s::%d-%d-%d\n' % (dtstr, login,
              dom, choice(tlds), dtint, llen, dlen)
    f.write(data)
    print('%s::%s@%s.%s::%d-%d-%d' % (dtstr, login,
              dom, choice(tlds), dtint, llen, dlen))
f.close()

Tue Jul 11 20:42:22 2045::udnuh@dophcy.org::2383389742-5-6
Fri Aug 27 11:25:17 2088::yrrjkn@jeofozsgij.com::3744415517-6-10
Mon Dec 27 00:07:53 2027::irroqg@esxxsydenrrz.net::1829837273-6-12
Thu Mar 23 19:43:25 2073::pwxmhj@fewylzchwuog.com::3257495005-6-12
Tue Mar  5 21:18:24 2058::xzyjyj@pybizkhnxsv.org::2782559904-6-11
Wed Feb 23 04:03:57 2061::voplu@plehkhmqixoc.com::2876328237-5-12
Thu Mar 28 13:53:51 2097::otpb@mdpzs.org::4015288431-4-5
Thu Jun  5 01:15:08 2064::szor@czvvpeefz.net::2979825308-4-9
Thu Jul 27 19:44:50 2084::ajsol@gczigg.net::3615536690-5-6
Tue Sep 18 05:03:34 2007::bvboc@qnyznjngbxtl.org::1190063014-5-12

1-17 判断在redata.txt中一周的每一天出现的次数(换句话说,读者也可以计算所选择的年份中每个月中出现的次数)。

In [48]:
#Fweekday = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
import re
patt = r'^\w{3}\s'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

['Tue ']
['Fri ']
['Thu ']
['Sun ']
['Fri ']
['Tue ']

In [50]:
import re
patt = r'\s\w{3}\s'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

[' Jul ']
[' Sep ']
[' Apr ']
[' Jul ']
[' Sep ']
[' May ']

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

In [3]:
import re
patt = r'^\w{3}\s\w{3}\s\s?\d{1,2}\s\d{2}:\d{2}:\d{2}'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

['Tue Jul 22 21:43:16']
['Fri Sep  6 19:02:00']
['Thu Apr 15 16:56:13']
['Sun Jul 28 20:56:50']
['Fri Sep  8 07:04:11']
['Tue May 10 05:08:50']

创建以下正则表达式。1-19 提取每行中完整的时间戳。

In [4]:
import re
patt = r'^\w{3}\s\w{3}\s\s?\d{1,2}\s\d{2}:\d{2}:\d{2}'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

['Tue Jul 22 21:43:16']
['Fri Sep  6 19:02:00']
['Thu Apr 15 16:56:13']
['Sun Jul 28 20:56:50']
['Fri Sep  8 07:04:11']
['Tue May 10 05:08:50']

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

In [7]:
import re
patt = r'\w+@\w+\.\w{3}'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

['qevi@hubpbwd.org']
['anbbwuj@guxnppqjbc.org']
['cckac@idfxboaglql.org']
['fgtfs@uwwmdqdemn.gov']
['dfzxv@yjukqnjo.gov']
['rbbwftb@hpjstxgnk.org']

1-21 仅仅提取时间戳中的月份。

In [9]:
import re
patt = r'\s\w{3}\s'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

[' Jul ']
[' Sep ']
[' Apr ']
[' Jul ']
[' Sep ']
[' May ']

1-22 仅仅提取时间戳中的年份。

In [12]:
import re
patt = r'(\d{4}):'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

['2104']
['1985']
['2032']
['2052']
['2102']
['2072']

1-23 仅仅提取时间戳中的时间(HH:MM:SS)。

In [24]:
import re
patt = r'\d{2}:\d{2}:\d{2}'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

['22:23:19']
['17:59:34']
['20:53:48']
['00:55:14']
['12:33:38']

1-24 仅仅从电子邮件地址中提取登录名和域名(包括主域名和高级域名一起提取)。

In [15]:
import re
patt = r'@(\w+\.\w{3})'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

['hubpbwd.org']
['guxnppqjbc.org']
['idfxboaglql.org']
['uwwmdqdemn.gov']
['yjukqnjo.gov']
['hpjstxgnk.org']

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

In [17]:
import re
patt = r'@(\w+)\.(\w{3})'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

[('hubpbwd', 'org')]
[('guxnppqjbc', 'org')]
[('idfxboaglql', 'org')]
[('uwwmdqdemn', 'gov')]
[('yjukqnjo', 'gov')]
[('hpjstxgnk', 'org')]

1-26 使用你的电子邮件地址替换每一行数据中的电子邮件地址。

In [31]:
import re
patt = r'\w+@\w+\.\w{3}'
f = open('redata.txt','r')
for i in f:
    #print(i)
    l = re.sub(patt,'xx@yy.com',i)
    print(l)
f.close()

Tue Jul 11 20:42:22 2045::xx@yy.com::2383389742-5-6Fri Aug 27 11:25:17 2088::xx@yy.com::3744415517-6-10Mon Dec 27 00:07:53 2027::xx@yy.com::1829837273-6-12Thu Mar 23 19:43:25 2073::xx@yy.com::3257495005-6-12Tue Mar  5 21:18:24 2058::xx@yy.com::2782559904-6-11Wed Feb 23 04:03:57 2061::xx@yy.com::2876328237-5-12Thu Mar 28 13:53:51 2097::xx@yy.com::4015288431-4-5Thu Jun  5 01:15:08 2064::xx@yy.com::2979825308-4-9Thu Jul 27 19:44:50 2084::xx@yy.com::3615536690-5-6Tue Sep 18 05:03:34 2007::xx@yy.com::1190063014-5-12

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

In [35]:
import re
patt = r'(\w{3})\s\s?(\d{1,2})\s\d{2}:\d{2}:\d{2}\s(\d{4})'
f = open('redata.txt','r')
for i in f:
    print(re.findall(patt, i.rstrip()))
f.close()

[('Jul', '11', '2045')]
[('Aug', '27', '2088')]
[('Dec', '27', '2027')]
[('Mar', '23', '2073')]
[('Mar', '5', '2058')]
[('Feb', '23', '2061')]
[('Mar', '28', '2097')]
[('Jun', '5', '2064')]
[('Jul', '27', '2084')]
[('Sep', '18', '2007')]

转载于:https://www.cnblogs.com/-Y-C-/p/7634103.html

Python核心编程 课后习题 第一部分相关推荐

  1. python核心编程课后习题解答第二章

    2–1. 变量, print 和字符串格式化运算符.启动交互式解释器.给一些变量赋值(字 符串,数值等等)并通过输入变量名显示它们的值.再用 print 语句做同样的事.这二者有 何区别? 也尝试着使 ...

  2. python核心编程6-14习题的解题思路

    #coding:utf-8 """ python核心编程6-14习题的解题思路 设计一个"石头,剪子,布"游戏,有时又叫"Rochambea ...

  3. python课后题答案第一章_python核心编程课后习题解答第一章

    闲着没事,决定将<python核心编程>这本书的课后习题做一遍,以增加自己的编程能力. 1-1 将python安装到系统上 本人用的ubuntu系统,系统中自带了python,无需安装,本 ...

  4. python教材答案第四章_python核心编程课后习题解答第四章

    4–1. Python 对象.与所有Python 对象有关的三个属性是什么?请简单的描述一下. type.ID.value..(身份.类型.值) type()接受一个对象作为参数,并返回它的类型 id ...

  5. python核心编程第二版第一章学习笔记

    一.名字来源 贵铎·范·罗萨姆(Guido van Rossum)于1989 年底始创了Python,那时,他还在荷兰的CWI(Centrum voor Wiskunde en Informatica ...

  6. 【python核心编程笔记+习题】-CH5-数字类型

    本章主题 数的简介 整型 布尔型 标准的整型 长整型 浮点型实数 复数 操作符 内建函数 其它数字类型 相关模块 Python 支持多种数字类型:整型.长整型.布尔型.双精度浮点型.十进制浮点型和复数 ...

  7. 【python核心编程笔记+习题】-CH7-映射

    本章主题 映射类型: 字典操作符 内建函数 内建方法 字典的键 集合类型 操作符 内建函数 内建方法 相关模块 一个字典对象是可变的,它是一个容器类型,能存储任意个数的 Python 对象,其中也包括 ...

  8. python核心编程-正则表达式习题(1)

    目录 识别后续的字符串: "bat"." bit"." but"." hat"." hit"或者&q ...

  9. 《Python核心编程》第二版第18页第一章练习 -Python核心编程答案-自己做的-

    <Python核心编程>第二版第18页第一章练习 这里列出的答案不是来自官方资源,是我自己做的练习,可能有误. 1.9 练习 1-1. 安装Python.请检查Python是否已经安装到你 ...

  10. python核心编程第三版_Python之父:自学python,这3本书能节约你一大半时间编程...

    今天给大家推荐三本书,有两本是属于一个系列,即<Python核心编程>第二版和第三版,一本讲基础和一本讲进阶,非常适合Python的初学者和有一定基础的学习者.还有一本书适合所有想学Pyt ...

最新文章

  1. 超棒整理 | Python 关键字知识点大放送
  2. R语言多因素有交互方差分析(Two-Way ANOVA)实战:拟合多因素有交互方差分析模型、分析不同分组的差异TukeyHSD、多因素有交互方差分析的结果总结
  3. Spring Boot 2.x中如何使用Log4j2记录日志
  4. windows mobile创建文本文件并用word打开
  5. 预测一下web前端未来的6个趋势
  6. python 如何做密码对话框_Python GUI教程(八):在主窗口中调用对话框
  7. Android开发原创教程
  8. 从入门到入土:Nessus出击:使用nessus扫描某台靶机
  9. cass生成曲线要素_CASS菜鸟入门指南-道路断面
  10. 支持javascript的ppt软件_14款基于Javascript的数据可视化工具
  11. NSOperation
  12. 费马小定理的归纳法证明和应用
  13. Mac版OneNote同步报错E000006B ctctv
  14. BladeX框架源码分析--00、包结构
  15. 颈椎病自我治疗预防颈椎病
  16. 让网页FLASH变成黑白的css语句
  17. 常用的软件工程相关技术标准
  18. Go秒杀系统——RabbitMQ核心概念与工作模式
  19. webkit研究日记2
  20. Ubuntu 安装 vim

热门文章

  1. (5)Scrum Master的7种武器之长生剑和孔雀翎
  2. Android 11.0 12.0SystemUI修改状态栏电池图标样式为横屏显示
  3. Axure RP 9.0 Enterprise 原型设计
  4. rails 分页 Paging kaminari
  5. PHP、Python 和 Ruby 语言的区别
  6. 云锁安装Linux服务器云锁安装说明
  7. IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍
  8. namespace is terminated
  9. 火狐浏览器设置默认缩放比例
  10. 【Fortran】STOP语句