Python核心编程 课后习题 第一部分
生活随笔
收集整理的這篇文章主要介紹了
Python核心编程 课后习题 第一部分
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Python核心編程 課后習(xí)題
第一部分 正則表達(dá)式
1-1 識(shí)別后續(xù)的字符串:“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 匹配由單個(gè)空格分隔的任意單詞對(duì),也就是姓和名。
In?[75]: data = 'adfass323f sadfa aadfa' patt = '\w+\s\w+' m = re.match(patt, data) m.group() Out[75]: 'adfass323f sadfa'1-3 匹配由單個(gè)逗號(hào)和單個(gè)空白符分隔的任何單詞和單個(gè)字母,如姓氏的首字母。
In?[82]: data = 'adfaf aa, dadada' patt = '\w+,\s\w+' m = re.search(patt, data) m.group() Out[82]: 'aa, dadada'1-4 匹配所有有效 Python 標(biāo)識(shí)符的集合。
In?[108]: data = 'adaas1212dfdfsadfaaf_' patt = '[_A-Za-z]+[_\w]+' #有效Python標(biāo)識(shí)符:以下劃線和字母開頭的非空字符, m = re.match(patt, data) m.group() Out[108]: 'adaas1212dfdfsadfaaf_'1-5 根據(jù)讀者當(dāng)?shù)氐母袷?#xff0c;匹配街道地址(使你的正則表達(dá)式足夠通用,來(lái)匹配任意數(shù)量的街道單詞,包括類型名稱)。例如,美國(guó)街道地址使用如下格式:1180 Bordeaux Drive。使你的正則表達(dá)式足夠靈活,以支持多單詞的街道名稱,如 3120 De la Cruz Boulevard。
In?[119]: data = '3120 De la Cruz Bou levard' patt = r'\d+.+' #以數(shù)字開頭的任何字符串 m = re.match(patt,data) m.group() Out[119]: '3120 De la Cruz Bou levard'1-6 匹配以“www”起始且以“.com”結(jié)尾的簡(jiǎn)單Web 域名;例如,www://www. yahoo.com/。選做題:你的正則表達(dá)式也可以支持其他高級(jí)域名,如.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 整數(shù)的字符串集。
In?[262]: data = '-123141234' patt = '[-|+]?\d+$' m = re.match(patt, data) m.group() Out[262]: '-123141234'1-8 匹配所有能夠表示 Python 長(zhǎng)整數(shù)的字符串集。
In?[264]: data = '123141234L' patt = '[-|+]?\d+[lL]' m = re.match(patt, data) m.group() Out[264]: '123141234L'1-9 匹配所有能夠表示 Python 浮點(diǎn)數(shù)的字符串集。
In?[272]: data = '-12310.09' patt = '[-|+]?\d+\.\d*' m = re.match(patt, data) m.group() Out[272]: '-12310.09'1-10 匹配所有能夠表示 Python 復(fù)數(shù)的字符串集。
In?[277]: data = '121+989i' patt = r'\d+(\+\d*i)' #簡(jiǎn)單的實(shí)部和虛部都是整數(shù) m = re.match(patt, data) m.group() Out[277]: '121+989i'1-11 匹配所有能夠表示有效電子郵件地址的集合(從一個(gè)寬松的正則表達(dá)式開始,然后嘗試使它盡可能嚴(yán)謹(jǐn),不過(guò)要保持正確的功能)。
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個(gè)字符,可使用字母、數(shù)字、下劃線,需以字母開頭 m = re.match(patt, data) m.group() Out[75]: 'y.1-a-9.a@t.w-0.9-3-c.com'1-12 匹配所有能夠表示有效的網(wǎng)站地址的集合(URL) (從一個(gè)寬松的正則表達(dá)式開始,然后嘗試使它盡可能嚴(yán)謹(jǐn),不過(guò)要保持正確的功能)。
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()。內(nèi)置函數(shù) type()返回一個(gè)類型對(duì)象,如下所示,
該對(duì)象將表示為一個(gè) Pythonic類型的字符串。 >>> type(0) <type 'int'> >>> type(.34) <type 'float'> >>> type(dir) <type 'builtin_function_or_method'> 創(chuàng)建一個(gè)能夠從字符串中提取實(shí)際類型名稱的正則表達(dá)式。函數(shù)將對(duì)類似于<type'int' >的字符串返回 int(其他類型也是如此,如 'float' 、'builtin_function_or_method' 等)。 注意:你所實(shí)現(xiàn)的值將存入類和一些內(nèi)置類型的__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 節(jié)提供了來(lái)匹配單個(gè)或者兩個(gè)數(shù)字字符串的正則表達(dá)式模式,來(lái)表示1~9 的月份(0?[1-9])。創(chuàng)建一個(gè)正則表達(dá)式來(lái)表示標(biāo)準(zhǔn)日歷中剩余三個(gè)月的數(shù)字。
In?[118]: date = '10 11 12 09' patt = '1\d' m = re.findall(patt,date) m Out[118]: ['10', '11', '12']1-15 處理信用卡號(hào)碼。1.2 節(jié)還提供了一個(gè)能夠匹配信用卡(CC)號(hào)碼([0-9]{15,16})的正則表達(dá)式模式。然而,該模式不允許使用連字符來(lái)分割數(shù)字塊。創(chuàng)建一個(gè)允許使用連字符的正則表達(dá)式,但是僅能用于正確的位置。例如,15 位的信用卡號(hào)碼使用 4-6-5 的模式,表明 4 個(gè)數(shù)字-連字符-6 個(gè)數(shù)字-連字符-5 個(gè)數(shù)字;16 位的信用卡號(hào)碼使用 4-4-4-4 的模式。記住,要對(duì)整個(gè)字符串進(jìn)行合適的分組。選做題:有一個(gè)判斷信用卡號(hào)碼是否有效的標(biāo)準(zhǔn)算法。編寫一些代碼,這些代碼不但能夠識(shí)別具有正確格式的號(hào)碼,而且能夠識(shí)別有效的信用卡號(hào)碼。
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-71-16 為 gendata.py 更新代碼,使數(shù)據(jù)直接輸出到 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-121-17 判斷在redata.txt中一周的每一天出現(xiàn)的次數(shù)(換句話說(shuō),讀者也可以計(jì)算所選擇的年份中每個(gè)月中出現(xiàn)的次數(shù))。
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 通過(guò)確認(rèn)整數(shù)字段中的第一個(gè)整數(shù)匹配在每個(gè)輸出行起始部分的時(shí)間戳,確保在redata.txt 中沒(méi)有數(shù)據(jù)損壞。
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']創(chuàng)建以下正則表達(dá)式。1-19 提取每行中完整的時(shí)間戳。
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 僅僅提取時(shí)間戳中的月份。
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 僅僅提取時(shí)間戳中的年份。
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 僅僅提取時(shí)間戳中的時(shí)間(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 僅僅從電子郵件地址中提取登錄名和域名(包括主域名和高級(jí)域名一起提取)。
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 僅僅從電子郵件地址中提取登錄名和域名(包括主域名和高級(jí)域名)。
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 使用你的電子郵件地址替換每一行數(shù)據(jù)中的電子郵件地址。
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-121-27 從時(shí)間戳中提取月、日和年,然后以“月,日,年”的格式,每一行僅僅迭代一次。
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')]轉(zhuǎn)載于:https://www.cnblogs.com/-Y-C-/p/7634103.html
總結(jié)
以上是生活随笔為你收集整理的Python核心编程 课后习题 第一部分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: new Ediary 3.0 updat
- 下一篇: 路由器wan口和lan口短接_路由器LA