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  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  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  in  tokenizer(pat,expr):
         print  (t)

输出结果:

wKiom1XoTU2w5hxGAAKv0VdWbiA920.jpg