re模块(* * * * *)
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
字符匹配(普通字符,元字符):
1 普通字符:大多数字符和字母都会和自身匹配
>>> re.findall('alvin','yuanaleSxalexwupeiqi')
['alvin']
2 元字符:.(匹配所有)
^只(从头开始匹配)
$(必须在最后匹配)
*(重复匹配)(0到无穷)
n2="kuisddddss"
>>> re.findall('d*',n2)
['', '', '', '', 'dddd', '', '', '']
>>> n3="asdhfale"
>>> re.findall("alex*",n3)
['ale']
+(重复匹配)(1到无穷)
>>> n3="asdhfale"
>>> re.findall("alex+",n3)
[]
?(重复匹配)(0或1次)
n4 = "asdhfale"
>>> re.findall("alex?",n4)
['ale']
n5= "asdhfalexxxxx"
>>> re.findall("alex?",n5)
['alex']
{ }自定义次数,如{0,}=*,{6}固定6次,{0,6}0到6次
[ ]或 比如x[yz] 匹配xy或xz 其它符号在[ ] 中皆为普通字符。除了-,比如[a-z]匹配a到z,和^比如[^a-z]匹配非a到z,和\转义符,比如\(\)
|或,比如ka|b,匹配ka或b
re.match类似serach加一个^
sub:替换,subn,结果显示替换次数
>>> re.sub(r"\d","a"," ki88s1i")
' kiaasai'
>>> re.subn(r"\d","a"," ki88s1i")
(' kiaasai', 3)
compile编辑规则
ssa=re.compile("\d+")
>>> ssa.findall("sdii888")
['888']
去优先级:
比如:(findall优先匹配组里的信息)
re.findall(r'www\.(baidu|3dm)\.com',"www.3dm.com")
['3dm']
去优先级:?:
>>> re.findall(r'www\.(?: baidu|3dm)\.com',"www.3dm.com")
['www.3dm.com']
再如
>>> re.findall(r'(abc)+',"abcabcabc")
['abc']
如何取出全部呢?依然是去优先级
>>> re.findall(r'(abc)+',"abcabcabc")
['abc']
元字符之. ^ $ * + ? { }
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
|
import
re
ret
=
re.findall(
'a..in'
,
'helloalvin'
)
print
(ret)
#['alvin']
ret
=
re.findall(
'^a...n'
,
'alvinhelloawwwn'
)
print
(ret)
#['alvin']
ret
=
re.findall(
'a...n$'
,
'alvinhelloawwwn'
)
print
(ret)
#['awwwn']
ret
=
re.findall(
'a...n$'
,
'alvinhelloawwwn'
)
print
(ret)
#['awwwn']
ret
=
re.findall(
'abc*'
,
'abcccc'
)
#贪婪匹配[0,+oo]
print
(ret)
#['abcccc']
ret
=
re.findall(
'abc+'
,
'abccc'
)
#[1,+oo]
print
(ret)
#['abccc']
ret
=
re.findall(
'abc?'
,
'abccc'
)
#[0,1]
print
(ret)
#['abc']
ret
=
re.findall(
'abc{1,4}'
,
'abccc'
)
print
(ret)
#['abccc'] 贪婪匹配
|
注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
1
2
|
ret
=
re.findall(
'abc*?'
,
'abcccccc'
)
print
(ret)
#['ab']
|
元字符之字符集[]:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#--------------------------------------------字符集[]
ret
=
re.findall(
'a[bc]d'
,
'acd'
)
print
(ret)
#['acd']
ret
=
re.findall(
'[a-z]'
,
'acd'
)
print
(ret)
#['a', 'c', 'd']
ret
=
re.findall(
'[.*+]'
,
'a.cd+'
)
print
(ret)
#['.', '+']
#在字符集里有功能的符号: - ^ \
ret
=
re.findall(
'[1-9]'
,
'45dha3'
)
print
(ret)
#['4', '5', '3']
ret
=
re.findall(
'[^ab]'
,
'45bdha3'
)
print
(ret)
#['4', '5', 'd', 'h', '3']
ret
=
re.findall(
'[\d]'
,
'45bdha3'
)
print
(ret)
#['4', '5', '3']
|
元字符之转义符\
反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
1
2
3
4
|
ret
=
re.findall(
'I\b'
,
'I am LIST'
)
print
(ret)
#[]
ret
=
re.findall(r
'I\b'
,
'I am LIST'
)
print
(ret)
#['I']
|
现在我们聊一聊\,先看下面两个匹配:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#-----------------------------eg1:
import
re
ret
=
re.findall(
'c\l'
,
'abc\le'
)
print
(ret)
#[]
ret
=
re.findall(
'c\\l'
,
'abc\le'
)
print
(ret)
#[]
ret
=
re.findall(
'c\\\\l'
,
'abc\le'
)
print
(ret)
#['c\\l']
ret
=
re.findall(r
'c\\l'
,
'abc\le'
)
print
(ret)
#['c\\l']
#-----------------------------eg2:
#之所以选择\b是因为\b在ASCII表中是有意义的
m
=
re.findall(
'\bblow'
,
'blow'
)
print
(m)
m
=
re.findall(r
'\bblow'
,
'blow'
)
print
(m)
|
元字符之分组()
1
2
3
4
5
6
|
m
=
re.findall(r
'(ad)+'
,
'add'
)
print
(m)
ret
=
re.search(
'(?P<id>\d{2})/(?P<name>\w{3})'
,
'23/com'
)
print
(ret.group())
#23/com
print
(ret.group(
'id'
))
#23
|
元字符之|
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
|
import
re
ret
=
re.findall(
'a..in'
,
'helloalvin'
)
print
(ret)
#['alvin']
ret
=
re.findall(
'^a...n'
,
'alvinhelloawwwn'
)
print
(ret)
#['alvin']
ret
=
re.findall(
'a...n$'
,
'alvinhelloawwwn'
)
print
(ret)
#['awwwn']
ret
=
re.findall(
'a...n$'
,
'alvinhelloawwwn'
)
print
(ret)
#['awwwn']
ret
=
re.findall(
'abc*'
,
'abcccc'
)
#贪婪匹配[0,+oo]
print
(ret)
#['abcccc']
ret
=
re.findall(
'abc+'
,
'abccc'
)
#[1,+oo]
print
(ret)
#['abccc']
ret
=
re.findall(
'abc?'
,
'abccc'
)
#[0,1]
print
(ret)
#['abc']
ret
=
re.findall(
'abc{1,4}'
,
'abccc'
)
print
(ret)
#['abccc'] 贪婪匹配
|
注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
1
2
|
ret
=
re.findall(
'abc*?'
,
'abcccccc'
)
print
(ret)
#['ab']
|
元字符之字符集[]:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#--------------------------------------------字符集[]
ret
=
re.findall(
'a[bc]d'
,
'acd'
)
print
(ret)
#['acd']
ret
=
re.findall(
'[a-z]'
,
'acd'
)
print
(ret)
#['a', 'c', 'd']
ret
=
re.findall(
'[.*+]'
,
'a.cd+'
)
print
(ret)
#['.', '+']
#在字符集里有功能的符号: - ^ \
ret
=
re.findall(
'[1-9]'
,
'45dha3'
)
print
(ret)
#['4', '5', '3']
ret
=
re.findall(
'[^ab]'
,
'45bdha3'
)
print
(ret)
#['4', '5', 'd', 'h', '3']
ret
=
re.findall(
'[\d]'
,
'45bdha3'
)
print
(ret)
#['4', '5', '3']
|
元字符之转义符\
反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
1
2
3
4
|
ret
=
re.findall(
'I\b'
,
'I am LIST'
)
print
(ret)
#[]
ret
=
re.findall(r
'I\b'
,
'I am LIST'
)
print
(ret)
#['I']
|
现在我们聊一聊\,先看下面两个匹配:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#-----------------------------eg1:
import
re
ret
=
re.findall(
'c\l'
,
'abc\le'
)
print
(ret)
#[]
ret
=
re.findall(
'c\\l'
,
'abc\le'
)
print
(ret)
#[]
ret
=
re.findall(
'c\\\\l'
,
'abc\le'
)
print
(ret)
#['c\\l']
ret
=
re.findall(r
'c\\l'
,
'abc\le'
)
print
(ret)
#['c\\l']
#-----------------------------eg2:
#之所以选择\b是因为\b在ASCII表中是有意义的
m
=
re.findall(
'\bblow'
,
'blow'
)
print
(m)
m
=
re.findall(r
'\bblow'
,
'blow'
)
print
(m)
|
元字符之分组()
1
2
3
4
5
6
|
m
=
re.findall(r
'(ad)+'
,
'add'
)
print
(m)
ret
=
re.search(
'(?P<id>\d{2})/(?P<name>\w{3})'
,
'23/com'
)
print
(ret.group())
#23/com
print
(ret.group(
'id'
))
#23
|