Python核心编程学习笔记之chapter15这一章蛮重要,代码都敲进去试过,请批评指正。
方便起见,程序写在py文件中。
1.识别下列字符串:“bat,”“bit,”“but,”“hat,”“hit,”或“hut”#!/usr/bin/env pythonimport repattern='[bh][aiu]t'm='bkibit'n=re.search(pattern,m)if n is not None:print n.group()Ps:还可以findall函数2.匹配用一个空格分隔的任意一对单词,比如,名和姓pattern='[A-Za-z]+\[A-Za-z]+'3.匹配用一个逗号和一个空格分开的一个单词和一个字母。
例如,英文人名中的姓和名的首字母pattern='[A-Za-z]+\.\[A-Za-z]'4.匹配所有合法的Python标识符pattern='[\w]+'Ps:不是非常完美,&算不算?5.请根据您(读者)本地关于地址的格式写法匹配一个街道地址(你写出的正则表达式要尽可能通用以匹配任意数目的表示街道名字的单词,包括类型指示)。
比如,美国的街道地址使用这样的格式:1180 Bordeaux Drive.使你写的正则表达式尽可能通用,要求能够匹配多个单词的街道名字,如:3120De la Cruz Boulevard.pattern='[\d]+\[A-Za-z\]+'Ps:1180Bordeaux Drive of New York呢?6.匹配简单的以“www.”开头,以“.com”作结尾的Web域名,例如:.附加题:使你写的正则表达式还支持其他顶级域名:.edu,.net 等,比如:.pattern='w{3}\.[\w]+\.[\w]+'Ps:seach与match的差别?7.匹配全体Python整数的字符串表示形式的集合pattern='\d+'8.匹配全体Python长整数的字符串表示形式的集合pattern='\d+[L]?'9.匹配全体Python浮点数的字符串表示形式的集合pattern='\d+\.\d*'10.匹配全体Python复数的字符串表示形式的集合pattern='\d*\.?\d*\+\d*\.?\d*j'11.匹配所有合法的电子邮件地址(先写出一个限制比较宽松的正则表达式,然后尽可能加强限制条件,但要保证功能的正确性)。
pattern='\w+\@\w+\.\w+'12.匹配所有合法的Web网站地址(URLs)(先写出一个限制比较宽松的正则表达式,然后尽可能加强限制条件,但要保证功能的正确性)。
pattern='www\.\w+\.\w+'13.type().type()内建函数返回一个对象类型,此对象显示为Python的字符串形式,如下所示:>>>type(0)<type'int'>>>>type(.34)<type'float'>>>>type(dir)<type'builtin_function_or_method'>请写一个正则表达式,能从这个字符串中提取出类型的名字。
你的函数能实现以下功能:如果以字符串“<type'int'>”做输入,会返回类型“int”.(返回其他类型也同理,如,返回类型‘float’,‘builtin_function_or_method’等)提示:正确的结果保存在类和某些内建类型的__name__属性里。
pattern='<type\\'(\w+)\'>'n=re.search(pattern,"<type'float'>")if n is not None:print n.group(1)14.正则表达式。
在15.2小节里,我们给出一个匹配由一位或两位数字代表一月到九月的字符串形式(“0?[1-9]”)。
请写出一个正则表达式表示标准日历上其它的三个月(十月、十一月、十二月)。
pattern='1[0-2]'15.正则表达式。
在15.2小节里,我们给出一个匹配信用卡卡号的模式:(“[0-9]{15,16}”).但这个模式不允许用连字符号分割信用卡卡号中的数字。
请写出一个允许使用连字符的正则表达式,但要求连字符必须出现在正确的位置。
例如,15位的信用卡卡号的格式是4-6-5,表示四个数字,一个连字符,后面接六个数字、一个连字符,最后是五个数字。
16位的信用卡卡号的格式是4-4-4-4,数位不足时,添0补位。
'([0-9]{4}\-?[0-9]{4}\-?[0-9]{4}\-?[0-9]{4}?)|\([0-9]{4}\-?[0-9]{6}\-?[0-9]{5})'ps:基于此思路还可以写出限制更宽松或更严格的条件,这里的问号我以为是出现一次或零次的意思,后来证实并非如此,但这个表达式是可行的16.修改脚本gendata.py的代码,使数据直接写入文件redata.txt 中,而不是输出到屏幕上。
#!/usr/bin/env pythonfrom random import randint,choicefrom string import lowercasefrom sys import maxintfrom time import ctimedoms=('com','edu','net','org','gov')t=''for i in range(randint(5,10)):dtint=randint(0,maxint-1)#pick datedtstr=ctime(dtint)#date stringshorter=randint(4,7)#login shorterem=''for j in range(shorter):#generate loginem+=choice(lowercase)longer=randint(shorter,12)#create domaindn=''for j in range(longer):dn+=choice(lowercase)t+='%s::%s@%s.%s::%d-%d-%d\n'%(dtstr,em,dn,choice(doms),dtint,shorter,longer) f=open('C:/python27/redata.txt','a')f.write(t)f.close()17.统计生成的redata.txt文件中,星期中的每一天出现的次数(或统计各月份出现的次数)。
#!/usr/bin/env pythonimport rem=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']for i in range(len(m)):x=[]pattern=m[i]f=open('C:/python27/redata.txt','r')for eachLine in f.readlines():n=re.search(pattern,eachLine)if n is not None:x+=[n.group()]print'%s appears%d times'%(m[i],len(x))18.通过检查每个输出行中整数字段部分的第一个整数是否和该行开头的时间戳相匹配来验证redata.txt中的数据是否完好#!/usr/bin/env pythonimport refrom time import ctimepattern='\:\:(\d+)'f=open('C:/python27/redata.txt','r')j=0for eachLine in f.readlines():n=re.search(pattern,eachLine)pattern1='[A-Z][a-z]{2}\[A-Z][a-z]{2}\\d+\ \d+\:\d+\:\d+\\d+'m=re.search(pattern1,eachLine).group()str(m)if n is not None:k=ctime(int(n.group(1)))str(k)if m==k:passelse:j+=1print'the%dth line is not complete'%j if j==0:print'the txt is complete'19.提取出每行中完整的时间戳字段pattern='[A-Z][a-z]{2}\[A-Z][a-z]{2}\\d+\\d+\:\d+\:\d+\\d+'20.提取出每行中完整的电子邮件地址。
(与前面的题考查内容相同,所以可以按自己喜好来做,尝试不同的思路)pattern='\:\:(.+?)\:\:'21.只提取出时间戳字段中的月份。
pattern='(\w{3})\\d{2}'22.只提取出时间戳字段中的年份pattern='[1-2]\d{3}'23.只提取出时间戳字段中的值(格式:HH:MM:SS)。
pattern='\d{2}\:\d{2}\:\d{2}'24.只从电子邮件地址中提取出登录名和域名(包括主域名和顶级域名,二者连在一起)pattern='\w+\@\w+\.\w{3}'25.只从电子邮件地址中提取出登录名和域名(包括主域名和顶级域名,二者分别提取)。
pattern='(\w+)\@(\w+\.\w{3})'26.将每行中的电子邮件地址替换为你自己的电子邮件地址n=re.sub(pattern,'dongyuguo@',eachLine)27.提取出时间戳中的月、日、年,并按照格式“月日,年”显示出来,且每行仅遍历一次#!/usr/bin/env pythonimport ref=open('C:/python27/redata.txt','r')pattern='(\w{3}\\d{2}).+?(\d{4})\:'for eachLine in f.readlines():n=re.search(pattern,eachLine)print n.group(1),',',n.group(2)28.区号(第一组的三个数字和它后面的连字符)是可选的,即,你写的正则表达式对800-555-1212和555-1212都可以匹配pattern='\d{3}\-\d{3}\-\d{4}|\d{3}\-\d{4}'29.区号中可以包含圆括号或是连字符,而且它们是可选的,就是说你写的正则表达式可以匹配800-555-1212,或555-1212,或(800) 555-1212pattern='\d{3}\-\d{3}\-\d{4}|\d{3}\-\d{4}|\(\d{3}\)\d{3}\-\d{4}'正如书上所说,这里的正则表达式只是皮毛,它的强大还有待进一步学习。