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)
|
输出结果:
本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1691231