re正则
正则 python3.8 官方文档 (opens new window)
# 正则用法
# 这个模块提供了与 Perl 语言类似的正则表达式匹配操作
import re
# 模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字节串 (bytes)。 但是,Unicode 字符串与8位字节串不能混用
# 正则表达式使用反斜杠字符 ('\') 来表示特殊形式或是允许在使用特殊字符时不引发它们的特殊含义
# 解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 'r' 前缀的字符串字面值中,反斜杠不必做任何特殊处理
# 有些字符,比如 '|' 或者 '(',属于特殊字符。 特殊字符既可以表示它的普通含义, 也可以影响它旁边的正则表达式的解释
# 重复修饰符 (*, +, ?, {m,n}, 等) 不能直接嵌套。这样避免了非贪婪后缀 ? 修饰符,和其他实现中的修饰符产生的多义性。
# 要应用一个内层重复嵌套,可以使用括号。 比如,表达式 (?:a{6})* 匹配6个 'a' 字符重复任意次数
# 特殊字符有
# . (点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符
# ^ (插入符号) 匹配字符串的开头, 并且在 MULTILINE 模式也匹配换行后的首个符号
# $ 匹配字符串尾或者在字符串尾的换行符的前一个字符,在 MULTILINE 模式下也会匹配换行符之前的文本 ,注意特殊情况
# * 对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 ab* 会匹配 'a','ab',或者 'a' 后面跟随任意个 'b'
# + 对它前面的正则式匹配1到任意次重复。 ab+ 会匹配 'a' 后面跟随1个以上到任意个 'b',它不会匹配 'a'
# ? 对它前面的正则式匹配0到1次重复。 ab? 会匹配 'a' 或者 'ab'
# '*', '+',和 '?' 修饰符都是 贪婪的;它们在字符串进行尽可能多的匹配,有时候并不需要这种行为
# .*? 非贪婪 .* 贪婪
# {m} 对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。比如, a{6} 将匹配6个 'a' , 但是不能是5个
# {m,n} 对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多,比如,a{3,5} 将匹配 3 到 5个 'a',忽略 n 指定上界为无限次,
# 比如 a{4,}b 将匹配 'aaaab' 或者1000个 'a' 尾随一个 'b',但不能匹配 'aaab',逗号不能省略
# {m,n}? 前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。比如,对于 'aaaaaa', a{3,5} 匹配 5个 'a' ,而 a{3,5}? 只匹配3个 'a'
# \ 转义特殊字符(允许你匹配 '*', '?', 或者此类其他),或者表示一个特殊序列
# [] 用于表示一个字符集合。在一个集合中
# 字符可以单独列出,比如 [amk] 匹配 'a', 'm', 或者 'k'
# 可以表示字符范围,通过用 '-' 将两个字符连起来。比如 [a-z] 将匹配任何小写ASCII字符,[0-5][0-9] 将匹配从 00 到 59 的两位数字
# 如果 - 进行了转义 (比如 [a\-z])或者它的位置在首位或者末尾(如 [-a] 或 [a-]),它就只表示普通字符 '-'
# 特殊字符在集合中,失去它的特殊含义。比如 [(+*)] 只会匹配这几个文法字符 '(', '+', '*', or ')'
# 字符类如 \w 或者 \S (如下定义) 在集合内可以接受,它们可以匹配的字符由 ASCII 或者 LOCALE 模式决定
# 取反:比如 [^5] 将匹配所有字符,除了 '5'
# 在集合内要匹配一个字符 ']',有两种方法,要么就在它之前加上反斜杠,要么就把它放到集合首位。比如, [()[\]{}] 和 []()[{}] 都可以匹配括号
# | A|B, A 和 B 可以是任意正则表达式,创建一个正则表达式,匹配 A 或者 B
# (...) (组合),匹配括号内的任意正则表达式,并标识出组合的开始和结尾,在findall的时候使用
# (?#...) 注释;里面的内容会被忽略
# 还有其他更多的情况,参考文档
# \number 匹配数字代表的组合。每个括号是一个组合,组合从1开始编号。比如 (.+) \1 匹配 'the the' 或者 '55 55'
# \A 只匹配字符串开始
# \b 匹配空字符串,但只在单词开始或结尾的位置
# \B 匹配空字符串,但 不 能在词的开头或者结尾
# \d 匹配任意数字,等价于 [0-9]
# \D 匹配任意非数字
# \s 匹配任何Unicode空白字符(包括 [ \t\n\r\f\v] ,还有很多其他字符,比如不同语言排版规则约定的不换行空格)
# \S 匹配任何非空白字符
# \w 匹配字母数字及下划线 [a-zA-Z0-9_]
# \W 匹配非字母数字及下划线
# \Z 只匹配字符串尾
# re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配
matchObj = re.match('[a-z]{3}', '1hello', re.M | re.A)
if matchObj:
print(matchObj.group())
else:
print('不匹配')
searchObj = re.search('[a-z]{3}', '1hello', re.M | re.A)
if searchObj:
print(searchObj.group())
else:
print('不匹配')
# 注意电话号码不要限制太死,可能涉及到后面更新,有新的规则出现,具体可以查找各个号码
def match_phone_number(number):
m = re.match('^1[3-9]\\d{9}$', number)
if m:
print(m.group())
return True
else:
print('电话号码不正确')
return False
match_phone_number('13012341234')
match_phone_number('130123412341')
# 其他使用请参考官网
# (.*?) 正则匹配
s = '<div class="nam">中国</div>'
res = re.findall(r'<div class=".*">(.*?)</div>', s)
print(res) # ['中国']
# re.compile(pattern, flags=0) ,将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象的方法 match(), search() 以及其他如下描述
# prog = re.compile(pattern)
# result = prog.match(string)
# 上面两行等同于:result = re.match(pattern, string) ,但是上面的prog可以重复使用,提高效率
# re.sub(pattern, repl, string, count=0, flags=0)
# 返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string
def dashrepl(matchobj):
if matchobj.group(0) == '-':
return ' '
else:
return '-'
res = re.sub('-{1,2}', dashrepl, 'pro----gram-files')
print(res) # pro--gram files
a = "张明 98分"
print(re.sub(r'\d+', '100', a))
# 按 : 和 空格 分割
s = "info:xiaoZhang 33 shandong"
print(re.split(r':| ', s)) # ['info', 'xiaoZhang', '33', 'shandong']
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
上次更新: 2023/09/04, 18:39:45
← Python面向对象 线程→