task1:
在一個文件中,單詞之間使用空格、分號、逗號或者句號分隔,請提取全部單詞。
代碼實例:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/local/python27/bin/python2.7 import ?sys import ?re words? = ?[] with? open (sys.argv[ 1 ])?as?f: ???? for ?line? in ?f: #這里使用了re.split()正則表達式分隔符,可以指定一個正則表達式作為分隔符來切分字符串;切分完之后返回一個列表添加到words列表中。 ???????? words.extend(re.split(r '\s*[;,\.\s]\s*' ,line)) ???? print (words) |
task2:
有一個目錄,保存了若干文件,找出其中所有的C源文件
解決方法:
-
listdir
-
使用os.path分割后綴
-
使用str.endswith判斷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/usr/local/python27/bin/python2.7 import ?os import ?sys def ?find_c_source(path): #os.listdir方法返回指定路徑下的所以文件及文件夾對象; ???? for ?filename? in ?os.listdir(path): #str.endswith方法專用于做文件后綴名判斷,可接受文件名后綴作為參數傳入,如果傳入單個參數則匹配此后綴的文件名,如果以元組的形式傳入多個參數則是或的關系,會把對應的都匹配出來。?? ???????? if ?filename.endswith(( ".c" , ".h" )): ???????????? yield ?filename if ?__name__? = = ?'__main__' : ???? for ?f? in ?find_c_source(sys.argv[ 1 ]): ???????? print ?f |
輸出結果:
task3
實現一個腳本可接受兩個參數,第一個參數為需要查找的路徑,第二個參數為需要匹配的文件可以支持通配符,返回匹配到的文件。
代碼實例:
輸出結果:
glob模塊也可以實現通配符查找功能
task4
完成日期格式的替換
代碼實例:
1 2 3 4 5 6 | #!/usr/local/python27/bin/python2.7 import ?re text? = ?"Today?is?09/03/2015,next?time?09/06/2015" new_text? = ?re.sub(r '(\d{2})/(\d{2})/(\d{4})' ,r '\3-\1-\2' ,text) print ?(new_text) |
re.sub (pattern模式,repl替換后的形式,string輸入的字符串,count,flags)
repl參數,可以通過位置參數引用pattern匹配的內容。?
1 | r '\3-\1-\2' ?#分別表示匹配到的年,月,日; |
輸出結果:
Today is 2015-09-03,next time 2015-09-06
附加功能:將月份的顯示轉成單詞的表示形式
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/local/python27/bin/python2.7 import ?re from ?calendar? import ?month_abbr #引入日歷模塊calendar.month_abbr方法實現轉換; def ?repl(match_obj): ???? return ?'%s-%s-%s' ?% ?(match_obj.group( 3 ),month_abbr[ int (match_obj.group( 1 ))],match_obj.group( 2 )) text? = ?"Today?is?09/03/2015,next?time?09/06/2015" new_text? = ?re.sub(r '(\d{2})/(\d{2})/(\d{4})' ,repl,text) print ?(new_text) |
輸出結果:
Today is 2015-Sep-03,next time 2015-Sep-06
task5
使用字符串格式化,創建一個模版引擎,可以使用變量來填充模版
代碼實例:
1 2 3 4 5 | #!/usr/local/python27/bin/python2.7 orgin_text? = ?"{name}?has?{n}?messages" text? = ?orgin_text. format (name = "tuchao" ,n = 37 ) print ?(text) |
輸出結果:
tuchao has 37 messages
task6
根據示例完成一個表達式解析引擎tokenizer
expr = "( src in 10.0.0.0/24 & !(src = 10.0.0.1)) | (src in 127.0.0.0/8 | dst in 127.0.0.0/8)"
代碼實例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #!/usr/local/python27/bin/python2.7 import ?re from ?collections? import ?namedtuple #定義一個命名元組 Token? = ?namedtuple( "Token" ,[ "type" , "value" ]) def ?tokenizer(pat,text,ignore = [ 'SPACE' ,?]): ???? scanner? = ?pat.scanner(text) #使用scanner.match方法匹配每一個語法的正則表達式???? ???? for ?m? in ?iter (scanner.match, None ): ???????? if ?m.lastgroup? not ?in ?ignore: ???????????? yield ?Token(m.lastgroup,m.group()) #m.lastgroup返回匹配到命名表達式的模式名稱,m.group()返回匹配對應的值; if ?__name__? = = ?'__main__' : ???? expr? = ?"(?src?in?10.0.0.0/24?&?!(src?=?10.0.0.1))?|?(src?in?127.0.0.0/8?|?dst?in?127.0.0.0/8)" #定義各項命名的匹配模式???? ???? SRC? = ?r '(?P<SRC>src)' ???? DST? = ?r '(?P<DST>dst)' ???? IN? = ?r '(?P<IN>in)' ???? SYMBOL? = ?r '(?P<SYMBOL>[&\|!]+)' ???? NETWORK? = ?r '(?P<NETWORK>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d{1,2})' ???? IPADDR? = ?r '(?P<IPADDR>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' ???? EQ? = ?r '(?P<EQ>=)' ???? BRACKETS? = ?r '(?P<BRACKETS>[\(\)]+)' ???? SPACE? = ?r '(?P<SPACE>\s+)' #編譯表達式,用或條件連接各個表達式???? ???? pat? = ?re. compile ( "|" .join([SRC,DST,IN,SYMBOL,NETWORK,IPADDR,EQ,BRACKETS,SPACE])) ???? print (expr) ???? for ?t? in ?tokenizer(pat,expr): ???????? print ?(t) |
輸出結果: