task1:
在一個檔案中,單詞之間使用空格、分号、逗号或者句号分隔,請提取全部單詞。
代碼執行個體:
1
2
3
4
5
6
7
8
9
10
11
<code>#!/usr/local/python27/bin/python2.7</code>
<code>import</code> <code>sys</code>
<code>import</code> <code>re</code>
<code>words </code><code>=</code> <code>[]</code>
<code>with </code><code>open</code><code>(sys.argv[</code><code>1</code><code>]) as f:</code>
<code> </code><code>for</code> <code>line </code><code>in</code> <code>f:</code>
<code>#這裡使用了re.split()正規表達式分隔符,可以指定一個正規表達式作為分隔符來切分字元串;切分完之後傳回一個清單添加到words清單中。</code>
<code> </code><code>words.extend(re.split(r</code><code>'\s*[;,\.\s]\s*'</code><code>,line))</code>
<code> </code><code>print</code><code>(words)</code>
task2:
有一個目錄,儲存了若幹檔案,找出其中所有的C源檔案
解決方法:
listdir
使用os.path分割字尾
使用str.endswith判斷
12
13
14
<code>import</code> <code>os</code>
<code>def</code> <code>find_c_source(path):</code>
<code>#os.listdir方法傳回指定路徑下的是以檔案及檔案夾對象;</code>
<code> </code><code>for</code> <code>filename </code><code>in</code> <code>os.listdir(path):</code>
<code>#str.endswith方法專用于做檔案字尾名判斷,可接受檔案名字尾作為參數傳入,如果傳入單個參數則比對此字尾的檔案名,如果以元組的形式傳入多個參數則是或的關系,會把對應的都比對出來。 </code>
<code> </code><code>if</code> <code>filename.endswith((</code><code>".c"</code><code>,</code><code>".h"</code><code>)):</code>
<code> </code><code>yield</code> <code>filename</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>for</code> <code>f </code><code>in</code> <code>find_c_source(sys.argv[</code><code>1</code><code>]):</code>
<code> </code><code>print</code> <code>f</code>
輸出結果:
<a href="http://s3.51cto.com/wyfs02/M01/72/7D/wKiom1XkZwGhK_5pAABxwTV8wx0132.jpg" target="_blank"></a>
task3
實作一個腳本可接受兩個參數,第一個參數為需要查找的路徑,第二個參數為需要比對的檔案可以支援通配符,傳回比對到的檔案。
<a href="http://s3.51cto.com/wyfs02/M01/72/84/wKioL1Xldkryl1UFAAEG4vdZoXQ033.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/72/87/wKiom1XldD-iscCsAAG2i3TslNU306.jpg" target="_blank"></a>
glob子產品也可以實作通配符查找功能
<a href="http://s3.51cto.com/wyfs02/M00/72/8A/wKiom1Xl0WKwd5-uAAEw1V4Yx-8876.jpg" target="_blank"></a>
task4
完成日期格式的替換
<code>text </code><code>=</code> <code>"Today is 09/03/2015,next time 09/06/2015"</code>
<code>new_text </code><code>=</code> <code>re.sub(r</code><code>'(\d{2})/(\d{2})/(\d{4})'</code><code>,r</code><code>'\3-\1-\2'</code><code>,text)</code>
<code>print</code> <code>(new_text)</code>
re.sub (pattern模式,repl替換後的形式,string輸入的字元串,count,flags)
repl參數,可以通過位置參數引用pattern比對的内容。
<code>r</code><code>'\3-\1-\2'</code> <code>#分别表示比對到的年,月,日;</code>
Today is 2015-09-03,next time 2015-09-06
附加功能:将月份的顯示轉成單詞的表示形式
<code>from</code> <code>calendar </code><code>import</code> <code>month_abbr</code>
<code>#引入月曆子產品calendar.month_abbr方法實作轉換;</code>
<code>def</code> <code>repl(match_obj):</code>
<code> </code><code>return</code> <code>'%s-%s-%s'</code> <code>%</code> <code>(match_obj.group(</code><code>3</code><code>),month_abbr[</code><code>int</code><code>(match_obj.group(</code><code>1</code><code>))],match_obj.group(</code><code>2</code><code>))</code>
<code>new_text </code><code>=</code> <code>re.sub(r</code><code>'(\d{2})/(\d{2})/(\d{4})'</code><code>,repl,text)</code>
Today is 2015-Sep-03,next time 2015-Sep-06
task5
使用字元串格式化,建立一個模版引擎,可以使用變量來填充模版
<code>orgin_text </code><code>=</code> <code>"{name} has {n} messages"</code>
<code>text </code><code>=</code> <code>orgin_text.</code><code>format</code><code>(name</code><code>=</code><code>"tuchao"</code><code>,n</code><code>=</code><code>37</code><code>)</code>
<code>print</code> <code>(text)</code>
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)"
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<code>from</code> <code>collections </code><code>import</code> <code>namedtuple</code>
<code>#定義一個命名元組</code>
<code>Token </code><code>=</code> <code>namedtuple(</code><code>"Token"</code><code>,[</code><code>"type"</code><code>,</code><code>"value"</code><code>])</code>
<code>def</code> <code>tokenizer(pat,text,ignore</code><code>=</code><code>[</code><code>'SPACE'</code><code>, ]):</code>
<code> </code><code>scanner </code><code>=</code> <code>pat.scanner(text)</code>
<code>#使用scanner.match方法比對每一個文法的正規表達式 </code>
<code> </code><code>for</code> <code>m </code><code>in</code> <code>iter</code><code>(scanner.match,</code><code>None</code><code>):</code>
<code> </code><code>if</code> <code>m.lastgroup </code><code>not</code> <code>in</code> <code>ignore:</code>
<code> </code><code>yield</code> <code>Token(m.lastgroup,m.group())</code>
<code>#m.lastgroup傳回比對到命名表達式的模式名稱,m.group()傳回比對對應的值;</code>
<code> </code><code>expr </code><code>=</code> <code>"( 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)"</code>
<code>#定義各項命名的比對模式 </code>
<code> </code><code>SRC </code><code>=</code> <code>r</code><code>'(?P<SRC>src)'</code>
<code> </code><code>DST </code><code>=</code> <code>r</code><code>'(?P<DST>dst)'</code>
<code> </code><code>IN </code><code>=</code> <code>r</code><code>'(?P<IN>in)'</code>
<code> </code><code>SYMBOL </code><code>=</code> <code>r</code><code>'(?P<SYMBOL>[&\|!]+)'</code>
<code> </code><code>NETWORK </code><code>=</code> <code>r</code><code>'(?P<NETWORK>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d{1,2})'</code>
<code> </code><code>IPADDR </code><code>=</code> <code>r</code><code>'(?P<IPADDR>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'</code>
<code> </code><code>EQ </code><code>=</code> <code>r</code><code>'(?P<EQ>=)'</code>
<code> </code><code>BRACKETS </code><code>=</code> <code>r</code><code>'(?P<BRACKETS>[\(\)]+)'</code>
<code> </code><code>SPACE </code><code>=</code> <code>r</code><code>'(?P<SPACE>\s+)'</code>
<code>#編譯表達式,用或條件連接配接各個表達式 </code>
<code> </code><code>pat </code><code>=</code> <code>re.</code><code>compile</code><code>(</code><code>"|"</code><code>.join([SRC,DST,IN,SYMBOL,NETWORK,IPADDR,EQ,BRACKETS,SPACE]))</code>
<code> </code><code>print</code><code>(expr)</code>
<code> </code><code>for</code> <code>t </code><code>in</code> <code>tokenizer(pat,expr):</code>
<code> </code><code>print</code> <code>(t)</code>
<a href="http://s3.51cto.com/wyfs02/M02/72/9C/wKiom1XoTU2w5hxGAAKv0VdWbiA920.jpg" target="_blank"></a>
本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1691231