Python核心編程之Regex-練習題解答

來源:互聯網
上載者:User

1. 識別下列字串:“bat,” “bit,” “but,” “hat,” “hit,” 或 “hut”  

import re<br />data=r'but,'<br />patt='b.t,?'<br />m=re.search(patt, data)<br />if m is not None:<br /> print m.group() 

 

2.匹配用一個空格分隔的任意一對單詞,比如,名和姓

 

    patt='/S+/s/S+' 

 

3. 匹配用一個逗號和一個空格分開的一個單詞和一個字母。例如,英文人名中的姓和名 的首字母  

 

    patt='/S+,/s/S' 

4. 匹配所有合法的Python標識符

   patt='/W' 

5.請根據您(讀者)本地關於地址的格式寫法匹配一個街道地址(你寫出的Regex要 儘可能通用以匹配任意數目的表示街道名字的單詞,

   包括類型指示)。比如,美國的街道地址使用這 樣的格式:1180 Bordeaux Drive.

   使你寫的Regex儘可能通用,要求能夠匹配多個單詞的街道 名字,

   如:3120 De la Cruz Boulevard. 

    patt='(/d+/s?)+(/S+/s?)+' 

 

6.匹配簡單的以“www.”開頭,以“.com”作結尾的Web網域名稱,例如:www.yahoo.com.

附 加題:使你寫的Regex還支援其他頂級網域名稱:.edu, .net 等,比如:www.ucsc.edu. 

 

    patt='^www/.(/S+)/.?[com|edu|cn]</p><p><br></p> 

 

7.匹配全體Python整數的字串表示形式的集合

 

    patt='/d+' 

8. 匹配全體Python長整數的字串表示形式的集合

 

   patt='/d+[L]?' 

 

9. 匹配全體Python浮點數的字串表示形式的集合

patt='/d+/./d+' 

 

10.匹配全體Python複數的字串表示形式的集合

    patt='[/d+|/d+/./d+]+[/d+|/d+/./d+]j' 

 

11.匹配所有合法的電子郵件地址(先寫出一個限制比較寬鬆的Regex,然後儘可能加 強限制條件,但要保證功能的正確性)。 

 

patt='/w+@(/w+/.)+com' 

 

12.匹配所有合法的 Web 網站地址(URLs)(先寫出一個限制比較寬鬆的Regex,然後儘可能加強限制條件,但要保證功能的正確性)。

 

patt='www/.(/w+/.)+(/w+)' 

 

13.type(). type()內建函數返回一個物件類型,此對象顯示為 Python 的字串形式, 

    如下所示:   

 

    >>> type(0)  

    <type 'int'>  

    >>> type(.34)  

    <type 'float'>  

     >>> type(dir)  

     <type 'builtin_function_or_method'>  

 

      請寫一個Regex,能從這個字串中提取出類型的名字。 你的函數能實現以下功能:如 

 果以字串“<type 'int'>”做輸入,會傳回型別“int”.(返回其他類型也同理,如,傳回型別‘float’,  

 ‘builtin_function_or_method’等) 提示:正確的結果儲存在類和某些內建類型的__name__屬性 裡。  

import re<br />data="<type 'int'>"<br />patt="<type/s'(/w+)'>"<br />m=re.search(patt, data)<br />if m is not None:<br /> print m.group(1) 

 

14.Regex。在 15.2 小節裡,我們給出一個匹配由一位或兩位元字代表一月到九月的 字串形式(“0?[1-9]”)。 請寫出一個Regex    表示標準日曆上其它的三個月(十月、十一月、 十二月)。  

patt="1[0-2]" 

 

15.Regex。在15.2小節裡,我們給出一個匹配信用卡卡號的模式:(“[0-9]{15,16}”).  

    但這個模式不允許用連字號號分割信用卡卡號中的數字。請寫出一個允許使用連字號的Regex, 

    但要求連字號必須出現在正確的位置。例如,15位的信用卡卡號的格式是4-6-5,表示四個數字,一 

    個連字號,後面接六個數字、一個連字號,最後是五個數字。16位的信用卡卡號的格式是4-4-4-4, 數位不足時,添0補位。

patt="([0-9]{4}-?[0-9]{6}-?[0-9]{5})|([0-9]{4}-?[0-9]{4}-?[0-9]{4}-[0-9]{4})" 

 

16.修改指令碼 gendata.py 的代碼,使資料直接寫入檔案 redata.txt 中,而不是輸出到屏 幕上。  

 

'''<br />Created on 2010-12-11<br />@author: Administrator<br />'''<br />from random import randint,choice<br />from string import lowercase<br />from sys import maxint<br />from time import ctime<br />doms=('com','edu','net','org','gov')<br />dtstr=''<br />for i in range(randint(5,10)):<br /> dtint=randint(0,maxint-1)<br /> dtstr+=ctime(dtint)<br />shorter=randint(4,7)<br />em=''<br />for j in range(shorter):<br /> em+=choice(lowercase)<br />longer=randint(shorter,12)<br />dn=''<br />for j in range(longer):<br /> dn+=choice(lowercase)<br />t= '%s::%s@%s.%s::%d-%d-%d' %(dtstr,em,dn,choice(doms),dtint,shorter,longer)<br />print t<br />f=open('redata.txt','a')<br />f.write(t)<br />f.close()<br /> 

 

18.通過檢查每個輸出行中整數欄位部分的第一個整數是否和該行開頭的時間戳記相匹配來 驗證redata.txt中的資料是否完好

 

patt='(/d+)/d+{3}' 

 

17.統計產生的redata.txt檔案中,星期中的每一天出現的次數(或統計各月份出現的次 數)。  

 

import re<br />patt='Jun'<br />f=open('redata.txt','r')<br />count=0<br />for eachLine in f.readlines():<br /> m=re.findall('Jun', eachLine)<br /> count+=len(m)<br /> print len(m)<br />#print data<br />print 'the count of :%s is %d' %(patt,count)<br /> 

 

18.通過檢查每個輸出行中整數欄位部分的第一個整數是否和該行開頭的時間戳記相匹配來 驗證redata.txt中的資料是否完好

 

patt='(/d+)/d+{3}' 

 

 

19. 提取出每行中完整的時間戳記欄位

 

patt='/s/d+{2}:/d+{2}:/d+{2}/s' 

 

20.提取出每行中完整的電子郵件地址。

patt='/w+@/w+/./w+' 

 

21.只提取出時間戳記欄位中的月份。

patt=':(/d+):' 

22.只提取出時間戳記欄位中的年份

patt='/s(/d+)</p><p><br></p><p><br></p> 

 

23.只提取出時間戳記欄位中的值(格式:HH:MM:SS)。

patt='/s/d+:/d+:/d+/s' 

 

24.只從電子郵件地址中提取出登入名稱和網域名稱(包括主網域名稱和頂級網域名稱,二者連在一起)

patt='(/w+)@(/w+/.?/w+)' 

25.只從電子郵件地址中提取出登入名稱和網域名稱(包括主網域名稱和頂級網域名稱,二者分別提取)。

 

patt='(/w+)@(/w+/.?/w+)' 

 

26. 將每行中的電子郵件地址替換為你自己的電子郵件地址

import re<br />patt='(/w+@/w+/.?/w+)'<br />f=open('redata.txt','r')<br />for eachLine in f.readlines():<br /> #print eachLine<br /> m=re.sub(patt, 'wangtao0422@gmail.com', eachLine)<br /> if m is not None:<br /> print m 

 

27.提取出時間戳記中的月、日、年,並按照格式“月 日,年”顯示出來,且每行僅遍 曆一次

 

import re<br />patt='(/S+)/s(/d+)/s/d+:/d+:/d+/s(/d+)</p><p><br></p><br /><p><br></p><br /><p><br></p><br /><p><br></p><br /><p><br></p><br /><p><br></p><br /><p><br></p><br />f=open('redata.txt','r')<br />for eachLine in f.readlines():<br /> #print eachLine<br /> m=re.search(patt,eachLine)<br /> if m is not None:<br /> print m.groups() 

 

28.區號(第一組的三個數字和它後面的連字號)是可選的,即,你寫的Regex對 800-555-1212和555-1212都可以匹配

 

patt='(/d{3}-)?/d{3}-/d{4}' 

 

29.區號中可以包含圓括弧或是連字號,而且它們是可選的,就是說你寫的Regex可以 匹配800-555-1212, 或

     555-1212, 或(800) 555-1212

 

patt='/(?/d{3}-?/)?/d{3}-/d{4}' 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.