天天看點

python 腳本學習(二)

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 &amp; !(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 &amp; !(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&lt;SRC&gt;src)'</code>

<code>    </code><code>DST </code><code>=</code> <code>r</code><code>'(?P&lt;DST&gt;dst)'</code>

<code>    </code><code>IN </code><code>=</code> <code>r</code><code>'(?P&lt;IN&gt;in)'</code>

<code>    </code><code>SYMBOL </code><code>=</code> <code>r</code><code>'(?P&lt;SYMBOL&gt;[&amp;\|!]+)'</code>

<code>    </code><code>NETWORK </code><code>=</code> <code>r</code><code>'(?P&lt;NETWORK&gt;\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&lt;IPADDR&gt;\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&lt;EQ&gt;=)'</code>

<code>    </code><code>BRACKETS </code><code>=</code> <code>r</code><code>'(?P&lt;BRACKETS&gt;[\(\)]+)'</code>

<code>    </code><code>SPACE </code><code>=</code> <code>r</code><code>'(?P&lt;SPACE&gt;\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