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

輸出結果:

wKiom1XkZwGhK_5pAABxwTV8wx0132.jpg


task3

實現一個腳本可接受兩個參數,第一個參數為需要查找的路徑,第二個參數為需要匹配的文件可以支持通配符,返回匹配到的文件。


代碼實例:

wKioL1Xldkryl1UFAAEG4vdZoXQ033.jpg


輸出結果:

wKiom1XldD-iscCsAAG2i3TslNU306.jpg


glob模塊也可以實現通配符查找功能

wKiom1Xl0WKwd5-uAAEw1V4Yx-8876.jpg


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)

輸出結果:

wKiom1XoTU2w5hxGAAKv0VdWbiA920.jpg