目录
1、re模块简介
- 在 Python 中,已经内置了一个re模块,用来帮助我们使用正则表达式。
【re模块中的函数】
函数 描述
compile(pattern) 创建模式对象
search(pattern,string) 在字符串中寻找模式
match(pattern,string) 在字符串开始处匹配模式
split(pattern,string) 根据模式分割字符串
findall(pattern,string) 列表形式返回匹配项
sub(pat,repl,string) pat匹配想用repl替换
escape(string) 特殊字符转义
2、compile 函数
- compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下:
re.compile(pattern[, flag])
- pattern 是一个字符串形式的正则表达式,
- flag 是一个可选参数,表示匹配模式,比如忽略大小写,多行模式等。
- 实例
import re
# 将正则表达式编译成 Pattern 对象
pattern = re.compile(r'd+')
2.1、match 方法
- match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。
- 它的一般使用形式如下:
match(string[, pos[, endpos]])
- string 是待匹配的字符串;
- pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。因此,当你不指定 pos 和 endpos 时,match 方法默认匹配字符串的头部。
- 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。
- 实例
import re
pattern = re.compile(r'd+') # 用于匹配至少一个数字
m = pattern.match('0123456789ur', 3, 10) # 从'3'的位置开始匹配,
print(m) # 返回一个 Match 对象
# group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
print(m.group(0))
# start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
print(m.start(0))
# end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
print(m.end(0))
# span([group]) 方法返回 (start(group), end(group))。
print(m.span(0))
2.2、search 方法
- search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。
- 它的一般使用形式如下:
search(string[, pos[, endpos]])
- string 是待匹配的字符串;
- pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。
- 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。
- 实例
import re
pattern = re.compile(r'd+') # 用于匹配至少一个数字
m = pattern.search('one12twothree34four')
print(m.group()) # 输出:12
'''2、指定字符串区间'''
m1 = pattern.search('one12twothree34four', 10, 30)
print(m1) # 输出:<_sre.SRE_Match object; span=(13, 15), match='34'>
print(m1.group()) # 输出:34
print(m1.span()) # 输出:(3, 5)
2.3、findall 方法
- findall 以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表。
- findall 方法的使用形式如下:
findall(string[, pos[, endpos]])
- string 是待匹配的字符串;
- pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。
- 实例:
import re
'''1、返回全部能匹配的子串'''
pattern = re.compile(r'd+')
m = pattern.findall('one12twothree34four')
print(m) # 输出:['12', '34']
'''2、指定字符串区间'''
m1 = pattern.findall('one12twothree34four', 0, 10)
print(m1) # 输出:['12']
2.4、finditer 方法
-
finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。
-
实例:
import re
pattern = re.compile(r'd+')
result_01 = pattern.finditer('one1two2three3four4')
print(result_01)
for i in result_01:
print(i.group())
# 输出结果:
'''
1
2
3
4
'''
2.5、split 方法
- split 方法按照能够匹配的子串将字符串分割后返回列表。
- 它的使用形式如下:
split(string[, maxsplit])
- maxsplit 用于指定最大分割次数,不指定将全部分割。
- 实例:
import re
pattern = re.compile(r'd+')
# 匹配数字,根据数字把字符串切割成列表
result_01 = pattern.split('one1two2three3four')
print(result_01)
# 输出结果:['one', 'two', 'three', 'four']
2.6、sub 方法
- sub 方法用于替换。它的使用形式如下:
sub(repl, string[, count])
repl 可以是字符串也可以是一个函数:
1、 repl 是字符串,则会使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,另外,repl 还可以使用 id 的形式来引用分组,但不能使用编号 0;
2、repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
count 用于指定最多替换次数,不指定时全部替换。
- 实例:
import re
'''1、repl 是字符串'''
pattern = re.compile(r'd+')
s = 'one1two2three3four'
# 匹配数字,根据数字把字符串切割成列表
result_01 = pattern.sub('替换', s)
print(result_01)
# 输出结果:one替换two替换three替换fou
'''1、repl 是函数'''
def func(m):
return '替换' + ' ' + m.group()
result_02 = pattern.sub(func, s)
print(result_02)
# 输出结果:one替换 1two替换 2three替换 3four
3、match 函数
- match 函数的使用形式如下:
re.match(pattern, string[, flags]):
- 实例:
import re
result_01 = re.match(r'd+', '2One12twothree34four')
print(result_01.group()) # 输出:2
4、search 函数
- search 函数的使用形式如下:
re.search(pattern, string[, flags])
5、findall 函数
- findall 函数的使用形式如下:
re.findall(pattern, string[, flags])
'''【实例】'''
import re
result_01 = re.findall(r'd+', '2One12twothree34four')
print(result_01) # 输出:['2', '12', '34']
6、finditer 函数
- finditer 函数的使用形式如下:
re.finditer(pattern, string[, flags])
7、split 函数
- split 函数的使用形式如下:
re.split(pattern, string[, maxsplit])
8、sub 函数
- sub 函数的使用形式如下:
re.sub(pattern, repl, string[, count])
9、匹配中文
import re
title = u'你好,hello,世界'
pattern = re.compile(r'[u4e00-u9fa5]+')
result = pattern.findall(title)
print(result)
# 输出结果:['你好', '世界']
10、正则表达模式
'''字符匹配'''
实例 描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符
'''特殊字符类'''
实例 描述
. 匹配除 "
" 之外的任何单个字符。要匹配包括 '
' 在内的任何字符,请使用象 '[.
]' 的模式。
d 匹配一个数字字符。等价于 [0-9]。
D 匹配一个非数字字符。等价于 [^0-9]。
s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f
v]。
S 匹配任何非空白字符。等价于 [^ f
v]。
w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
参考: