1、首先要导入python的re模块。
2、元字符 . ^ $ * + ? {} [] \ | ()
re模块中的findall(str1,str2)方法返回字串str2中匹配str1格式的字串。例如在字符串'dit dot det,dct dit dot'中匹配'dit'结果为:
1
2
|
str1
=
'dit dot det,dct dit dot'
print
re.findall(
'dit'
,str1)
|
结果:
1
|
[
'dit'
,
'dit'
]
|
|作用:'dit|dct'表示dit或者dct。
1
2
|
str1
=
'dit dot det,dct dit dot'
print
re.findall(
'dit|dct'
,str1)
|
结果:
1
|
[
'dit'
,
'dct'
,
'dit'
]
|
[]作用:[ic]表示i或c,例如'd[ic]t'表示dit和dct两者,和'dit|dct'等价:
1
2
|
str1
=
'dit dot det,dct dit dot'
print
re.findall(
'd[ic]t'
,str1)
|
结果:
1
|
[
'dit'
,
'dct'
,
'dit'
]
|
^作用一:[^ic]中^表示否定,即除了i和c:
1
2
|
str1
=
'dit dot det,dct dit dot'
print
re.findall(
'd[^ic]t'
,str1)
|
结果:
1
|
[
'dot'
,
'det'
,
'dot'
]
|
^作用二:^dit表示子串dit在开头位置,而dct不是在开头:
1
2
3
|
str1
=
'dit dot det,dct dit dot'
print
re.findall(
'^dit'
,str1)
print
re.findall(
'^dct'
,str1)
|
结果:
1
|
[
'dit'
][]
|
$作用:dot$表示子串dot要在末尾位置,而dct不是在末尾:
1
2
3
|
str1
=
'dit dot det,dct dit dot'
print
re.findall(
'dot$'
,str1)
print
re.findall(
'dct$'
,str1)
|
结果:
1
|
[
'dot'
][]
|
.作用:d.t表示d与t之间省略了一个任意字符:
1
2
|
str1
=
'dit dot det,dct dit dot'
print
re.findall(
'd.t'
,str1)
|
结果:
1
|
[
'dit'
,
'dot'
,
'det'
,
'dct'
,
'dit'
,
'dot'
]
|
+作用:di+t表示d与t之间省略了一个或多个'i':
1
2
|
str1
=
'd dt dit diit det'
print
re.findall(
'd.+t'
,str1)
|
结果:
1
|
[
'dit'
,
'diit'
]
|
*作用:di*t表示d与t之间省略了零个至多个'i':
1
2
|
str1
=
'd dt dit diit det'
print
re.findall(
'd.*t'
,str1)
|
结果:
1
|
[
'dt'
,
'dit'
,
'diit'
]
|
经常,'.'和'+'或者'*'搭配使用。'.+'表示省略了一个至多个任意元素,'.*'表示省略了零个至多个任意元素:
1
2
3
|
str1
=
'd dt dit diit det'
print
re.findall(
'd.+t'
,str1)
print
re.findall(
'd.*t'
,str1)
|
结果:
1
|
[
'd dt dit diit det'
][
'd dt dit diit det'
]
|
?作用一:看.+的匹配结果,'dit'、'dot'也满足'd.+t'的匹配条件,而输出的却是满足匹配条件的最长子串'dit dot det,dct dit dot',这个叫贪婪匹配。如果要输出最短的匹配字串,只需在'+'后面加上'?':(注:对于'*'也是一样,只需在'*'后面加上'?')
1
2
|
str1
=
'd dt dit diit det'
print
re.findall(
'd.+?t'
,str1)
|
结果:
1
|
[
'dit'
,
'dot'
,
'det'
,
'dct'
,
'dit'
,
'dot'
]
|
?作用二:di?t表示i可有可无,即dt、dit都满足匹配条件:
1
2
|
str1
=
'd dt dit diit det'
print
re.findall(
'di?t'
,str1)
|
结果:
1
|
[
'dt'
,
'dit'
]
|
{}作用一:di{n}t表示d和t之间有n个'i':
1
2
|
str1
=
'dt dit diit diiit diiiit'
print
re.findall(
'di{2}t'
,str1)
|
结果:
1
|
[
'diit'
]
|
{}作用二:di{n,m}t表示d和t之间有n到m个'i':
1
2
|
str1
=
'dt dit diit diiit diiiit'
print
re.findall(
'di{1,3}t'
,str1)
|
结果:
1
|
[
'dit'
,
'diit'
,
'diiit'
]
|
其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;{,}表示任意个,和'*'功能一样:
1
2
3
4
|
str1
=
'dt dit diit diiit diiiit'
print
re.findall(
'di{1,}t'
,str1)
print
re.findall(
'di{,3}t'
,str1)
print
re.findall(
'di{,}t'
,str1)
|
结果:
1
2
3
|
[
'dit'
,
'diit'
,
'diiit'
,
'diiiit'
]
[
'dt'
,
'dit'
,
'diit'
,
'diiit'
]
[
'dt'
,
'dit'
,
'diit'
,
'diiit'
,
'diiiit'
]
|
\作用一:取消元字符,变成转义字符:
1
2
3
|
str1
=
'^abc ^abc'
print
re.findall(
'^abc'
,str1)
print
re.findall(
'\^abc'
,str1)
|
结果:
1
|
[][
'^abc'
,
'^abc'
]
|
\作用二:预定义字符
1
2
3
|
str1
=
'12 abc 345 efgh'
print
re.findall(
'\d+'
,str1)
print
re.findall(
'\w+'
,str1)
|
结果:
1
2
|
[
'12'
,
'345'
]
[
'12'
,
'abc'
,
'345'
,
'efgh'
]
|
()作用:在匹配字符串后,只输出匹配字串'()'里面的内容:
1
2
3
4
|
str1
=
'12abcd34'
print
re.findall(
'12abcd34'
,str1)
print
re.findall(
'1(2a)bcd34'
,str1)
print
re.findall(
'1(2a)bc(d3)4'
,str1)
|
结果:
1
2
3
|
[
'12abcd34'
]
[
'2a'
]
[(
'2a'
,
'd3'
)]
|
3、re模块里的主要方法:findall()、finditer()、match()、search()、compile()、split()、sub()、subn()。
re.findall(pattern,string,flags = 0)
作用:在string中从左往右搜索与pattern匹配的字串,结果以list形式返回。
1
2
|
str1
=
'ab cd'
print
re.findall(
'\w+'
,str1)
|
结果:['ab', 'cd']
re.finditer(pattern,string,flags = 0)
作用:其功能与re.findall相同,但结果以迭代器的形式返回。
1
2
3
4
|
str1
=
'ab cd'
iter1
=
re.finditer(
'\w+'
,str1)
for
a
in
iter1:
print
a.group(),a.span()
|
结果:
ab (0, 2)
cd (3, 5)
(注:a.group()返回满足匹配调节的字串,a.span()返回字串的起始位置和末尾位置)
re.search(pattern,string,flags = 0)
作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,否则返回一个search实例。
1
2
3
4
5
6
|
str1
=
'ab cd'
result
=
re.search(
'cd'
,str1)
if
result
=
=
None
:
print
'None'
else
:
print
result.group(),result.start(),result.end()
|
结果:cd 3 5
re.match(pattern,string,flags = 0)
作用:判断string的头部是否与pattern匹配,是则返回match实例,否则返回None。
1
2
3
4
5
6
|
str1
=
'ab cd'
result
=
re.match(
'cd'
,str1)
if
result
=
=
None
:
print
'None'
else
:
print
result.group(),result.start(),result.end()
|
结果:None
re.compile(pattern,flags = 0)
作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,可以大幅提高匹配速度。
1
2
3
|
str1
=
'ab cd'
pre
=
re.
compile
(
'ab'
)
print
pre.findall(str1)
|
结果:['ab']
re.split(pattern,string,maxsplit = 0,flags = 0)
作用:在string匹配pattern的时候做分割:
1
2
3
4
|
str1
=
'ab.c.de'
str2
=
'12+34-56*78/90'
print
re.split(
'\.'
,str1)
print
re.split(
'[\+\-\*/]'
,str2)
|
结果:
['ab', 'c', 'de']
['12', '34', '56', '78', '90']
re.sub(pattern,repl,string,count = 0,flags = 0)
作用:在string当中把满足pattern正则的字串替换成repl:
1
2
|
str1
=
'abcde'
print
re.sub(
'bc'
,
'123'
,str1)
|
结果:a123de
re.subn(pattern,repl,string,count = 0,flags = 0)
作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次
1
2
|
str1
=
'abcdebce'
print
re.subn(
'bc'
,
'123'
,str1)
|
结果:('a123de123e', 2)