一、相关模块和方法

  • 模块:re
  • 匹配数据方法(从头开始匹配字符串数据):re.match('正则表达式',字符串)
  • 获取结果方法:re.match('正则表达式',字符串).group()

二、正则表达式语法

1. 匹配单个字符

语法 功能
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字
\s 匹配空白,即空格,tab键,\t制表符
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W 匹配特殊字符,即非字母、非数字、非汉字
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import re

str_ = 'abc456'

result = re.match('.',str_)
print(result.group())

result = re.match('a.c',str_)
print(result.group())

#a
#abc
import re

str_ = 'abc456'

result = re.match('[a-zA-Z]',str_)
print(result.group())

# [0123456789] == [0-9] == [0-45-9]
result = re.match('abc[0-9]',str_)
print(result.group())

#a
#abc4
import re

str_ = 'abc456'

result = re.match('abc\d',str_)
print(result.group())

#abc4
import re

str_ = 'abc456'

result = re.match('ab\D',str_)
print(result.group())

#abc
import re

str_ = 'abc4 56'

result = re.match('abc4\s5',str_)
print(result.group())

#abc4 5
import re

str_ = 'abc456'

result = re.match('abc\S',str_)
print(result.group())

#abc4
import re

str_ = 'abc_456'

result = re.match('abc\w',str_)
print(result.group())

#abc_
import re

str_ = 'abc$456'

result = re.match('abc\W',str_)
print(result.group())

#abc$

2. 匹配多个字符

语法 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现从m到n次
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
33
34
35
36
37
38
39
40
import re

str_ = 'aabc456'

result = re.match('a*',str_)
print(result.group())

#aa
import re

str_ = 'aabc456'

result = re.match('a+',str_)
print(result.group())

#aa
import re

str_ = 'aabc456'

result = re.match('a?',str_)
print(result.group())

#a
import re

str_ = 'aaabc456'

result = re.match('a{2}',str_)
print(result.group())

#aa
import re

str_ = 'aaabc456'

result = re.match('a{1,3}',str_)
print(result.group())

#aaa

3. 匹配开头和结尾

语法 功能
^ 匹配字符串开头
$ 匹配字符串结尾
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import re

str_ = 'aaabc456'

result = re.match('^a.*6$',str_)
print(result.group())

result = re.match('^a.*',str_)
print(result.group())

result = re.match('.*6$',str_)
print(result.group())

#aaabc456
#aaabc456
#aaabc456

4. 匹配非指定字符

语法 功能
[^指定字符] 匹配非指定字符
1
2
3
4
5
6
7
8
import re

str_ = 'aaabc456'

result = re.match('[^b]',str_)
print(result.group())

#a

5. 匹配分组

语法 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用第num个分组匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import re

# 水果列表
fruit_list = ["apple", "banana", "orange", "pear"]

# 遍历数据
for value in fruit_list:
# | 匹配左右任意一个表达式
match_obj = re.match("apple|pear", value)
if match_obj:
print("%s是我想要的" % match_obj.group())
else:
print("%s不是我要的" % value)


#apple是我想要的
#banana不是我要的
#orange不是我要的
#pear是我想要的
import re

match_obj = re.match("[a-zA-Z0-9_]{4,20}@(163|126|qq|sina|yahoo)\.com", "hello@163.com")
if match_obj:
print(match_obj.group())
# 获取分组数据
print(match_obj.group(1))
else:
print("匹配失败")

#hello@163.com
#163
match_obj = re.match("<([a-zA-Z1-6]+)><([a-zA-Z1-6]+)>.*</\\2></\\1>", "<html><h1>www.baidu.cn</h1></html>")

if match_obj:
print(match_obj.group())
else:
print("匹配失败")

#<html><h1>www.baidu.cn</h1></html>
match_obj = re.match("<(?P<name1>[a-zA-Z1-6]+)><(?P<name2>[a-zA-Z1-6]+)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.baidu.cn</h1></html>")

if match_obj:
print(match_obj.group())
else:
print("匹配失败")

#<html><h1>www.baidu.cn</h1></html>