Python正则表达式

学习地址

参考资料:

  1. Python 正则表达式
  2. 正则表达式精讲

目的

  1. 处理文本(字符串)
  2. 语言规则
  3. 前端通用

导入模块

import re
全称:regular expression

正则表达式语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
^         匹配字符串开头如 ^p
$         匹配字符串结尾如 $n
\A       指定字符串必须出线在开头
\Z       指定字符串必须出线在结尾
.         匹配任意一个字符
[...]    匹配字符集
\d       匹配一个数字
\D       匹配一个非数字
\s        匹配一个空白字符
\S        匹配一个非空白字符
\w       匹配一个数字或字母
\W       匹配一个非单词字符
[^...]   [^abc] 匹配除了a,b,c之外的字符
*       匹配前一个字符0次或无限次
+         匹配前一个字符1次或无限次
?         匹配前一个字符0次或1次

正则表达式修饰符 - 可选标志

1
2
3
4
5
6
re.I	使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

常用方法

1. re.findall()

说明:Return a list of all non-overlapping matches in the string,If one or more capturing groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. - 以列表的形式返回所有不重叠的所匹配到的子串,如果匹配失败返回空列表[];如果模式串中有多个组,以列表形式返回所有匹配到的元组
示例1:

1
2
3
4
a='aaabaabc'
print(re.findall('aa',a))

>>>['aa', 'aa']

示例2:

1
2
3
4
a='1a23bc456def'
print(re.findall('(\d+)(..)',a))

>>>[('1', 'a2'), ('3', 'bc'), ('456', 'de')]

元字符: 在正则表达式中具有特殊意义的专用字符,比如\d表示数字
示例:

1
2
3
4
a='1a2b3c'
print(re.findall('\d',a)) # 如果想搜索两个数字需要用\d\d,依次类推,但比较麻烦,可以使用+号

>>>['1', '2', '3']

2. ‘+’ 、 ‘*’ 和 ‘.’ 号的使用

说明:’+’ 匹配一个或多个字符, ‘*’ 匹配0个或多个字符 ,’.’ 匹配任意一个字符

示例:

1
2
3
4
5
6
7
a='12a34b567c'
print(re.findall('\d+',a)) # 连续匹配直到非数字
print(re.findall('\d*',a))
print(re.findall('\d+.',a)) # 与 print(re.findall('\d*.',a)) 结果相同
>>>['12', '34', '567']
>>>['12', '', '34', '', '567', '', '']
>>>['12a', '34b', '567c']

3. 范匹配与精确匹配

范匹配: 在搜索想要的内容时把其他的内容也匹配进来了
精确匹配: 在范匹配的基础上得到想要的内容,方法是用()将想要的内容括起来
示例:

1
2
3
4
a='1a23bc456def'
print(re.findall('\d+(..)',a)) # 精确匹配

>>>['a2', 'bc', 'de']

4. 字符集

说明:用[]指定搜索字符集
示例1:

1
2
3
4
5
6
7
8
9
10
a='1a23bc456def'
print(re.findall('[0-9]',a))
print(re.findall('[0-9]+',a))
print(re.findall('[0-9a-z]',a))
print(re.findall('[0-9]{2}',a)) # 指定匹配长度为2,{2,5}指定长度为2/3/4/5,注意不会重复匹配

>>>['1', '2', '3', '4', '5', '6']
>>>['1', '23', '456']
>>>['1', 'a', '2', '3', 'b', 'c', '4', '5', '6', 'd', 'e', 'f']
>>>['23', '45']

5. 贪婪匹配(默认)与非贪婪匹配

说明:当有多种匹配情况时,尽量往后靠,比如指定长度{2,5},会直接先匹配5
示例:

1
2
3
4
5
6
a='1a23bc456def'
print(re.findall('[0-9]{1,3}',a))  # 贪婪匹配,直接匹配456而非截取45
print(re.findall('[0-9]{1,3}?',a),re.S) # 非贪婪匹配,re.S为可选参数表示忽略换行符的影响

>>>['1', '23', '456']
>>>['1', '2', '3', '4', '5', '6']

6. re.match()

说明:Try to apply the pattern at the start of the string, returning a match object, or None if no match was found - 匹配开头,只匹配一次,成功返回对象,否则返回None
语法: re.match(pattern, string, flags=0), pattern表示匹配的正则表达式, string 表示要匹配的字符串。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等。

示例:

1
2
3
4
5
6
7
8
9
10
a='1a 23bc 456def'
print(re.match('a',a))
print(re.match('1a 23bc',a))
print(re.match('1a 23bc',a,).group()) # 查看匹配结果
print(re.match('1a 23bc',a).span())  # 返回匹配下标范围如果失败报错

>>>None
>>><_sre.SRE_Match object; span=(0, 7), match='1a 23bc'>
>>>1a 23bc
>>>(0, 7)

说明:re.search 扫描整个字符串并返回第一个成功的匹配。匹配成功re.search方法返回一个匹配的对象,否则返回None。

示例:

1
2
3
4
5
6
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配

>>>(0,3)
>>>(11,14)

8. re.compile()

说明:Compile a regular expression pattern, returning a pattern object - compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象。

示例:

1
2
3
4
5
a='1a 23bc 456def'
reg=re.compile('\d+') # 避免重复
print(re.findall(reg,a))

>>>['1', '23', '456']

9. re.sub()

说明:将字符串中正则表达式所匹配到的内容替换为指定内容。
语法:re.sub(pattern, repl, string, count=0, flags=0),pattern : 正则中的模式字符串;repl : 替换的字符串,也可为一个函数;string : 要被查找替换的原始字符串;count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

示例:

1
2
3
4
5
6
7
a='1a 23bc 456def'
print('Before:',a)
a=re.sub('\s','',a) # 匹配任意空白字符,等价于[\t\n\r\f]
print('After:',a)

>>>Before: 1a 23bc 456def
>>>After: 1a23bc456def

10. re.split()

说明:split 方法按照能够匹配的子串将字符串分割后返回列表
语法:re.split(pattern, string, maxsplit=0, flags=0]),maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数

示例:

1
2
3
4
a='1a 23bc 456def'
print(re.split('\W',a))

>>>['1a', '23bc', '456def']