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) |
输出结果: