正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串
一、常用操作符
正则表达式中的常用操作符如下
| 操作符 | 说明 | 举例 |
|---|---|---|
| . | 表示单个字符 | |
| [ ] | 字符集,对单个字符给出取值范围 | [abc] 表示a、b、c;[a-z] 表示a到z的任意单个字符 |
| [^ ] | 给字符集,对单个字符串给出排除范围 | [^abc] 表示非a、b、c的任意单个字符 |
| * | 前一个字符0次或无限次扩展 | abc* 表示ab、abc、abcc… |
| + | 前一个字符1次或无限次扩展 | abc+ 表示abc、abcc、abccc… |
| ? | 前一个字符0次或一次扩展 | abc? 表示ab、abc |
| | | 左右表达式中的任意一个 | abc|def 表示abc或def |
| {m} | 扩展前一个字符m次 | ab{2}c 表示abbc |
| {m, n} | 扩展前一个字符m到n次,包括n次 | ab{1,2}c 表示abc、abbc |
| ^ | 匹配字符串开头 | ^abc 表示以字符串abc开头 |
| $ | 匹配字符串结尾 | |
| () | 分组标记,内部使用 | 操作符 | (abc|def )表示abc或def |
| \d | 数字符号,等价于[0-9] | |
| \w | 等价于[A-Za-z0-9] |
二、正则表达式的类型
raw string (原生字符串类型):不包含转义字符的字符串,表示形式为r'text'
string(字符串类型):包含转义字符的字符串
比如匹配数字符号,使用原生子串的形式表示为 r'\d',使用字符串类型表示的话,因为 \ 是特殊字符,因此需要进行转义,表示为 '\\d'。由此可见使用原生字符串类型要相对简单一些
三、Re库常用的方法
Python 中通过 Re 库提供对正则表达式的支持,下面主要介绍一下 Re 库中主要使用的函数
1.re.search(pattern, string, flags):在一个字符串中搜索匹配正则表达式的第一个子串,返回 Match 对象
pattern:正则表达式的字符串或原生字符串的表示string:待匹配的字符串flags:正责表达式使用时的控制标记,这个参数是可变的flags常用的标记:re.I(re.IGNORECASE):忽略正则表达式的大小写re.M(re.MULTILINE):正则表达式中的^操作符将给定的字符串的每行当做匹配的开始re.S(re.DOTALL):.操作符能够匹配所有字符,默认匹配除换行的所有字符
举例
import re
# 用于匹配连续的 5 个数字
match = re.search(r'\d{5}', 'f123456g654321')
if match:
print(match.group(0))
# 12345
2.re.match(pattern, string, flags):从一个字符串的开始位置起匹配正则表达式,返回 Match 对象
举例1
import re
# 从字符串开始问看看匹配符合条件的 5 个连续的数字
match = re.match(r'\d{5}', 'f123456g654321')
if match:
print(match.group(0))
# 输出空,没有符合条件的字符串
举例2
import re
match = re.match(r'\d{5}', '123456g654321')
if match:
print(match.group(0))
# 12345
3.re.findall(pattern, string, flags):搜索字符串,返回一个符合条件的所有子串的集合
举例
import re
ls = re.findall(r'\d{5}', '123456g654321')
print(ls)
# ['12345', '65432']
4.re.split(pattern, string, maxsplit,flags):将一个字符串按照正则表达式匹配的结果进行分割,返回列表类型
maxsplit:表示最大的分割数
举例
import re
ls = re.split(r'[a-z]', '123a45b6', maxsplit=1)
print(ls)
# ['123', '45b6'] -> 后面的字符串不进行分割而是整个返回
5.re.finditer(pattern, string, maxsplit,flags):搜索字符串,返回一个符合结果的迭代类型,每个迭代元素是 match 对象
举例
import re
m = re.finditer(r'\d{5}', '123456g654321')
for i in m:
print(i.group(0))
# 12345
# 65432
6.re.sub(pattern, replace, string, maxsplit,count, flags):使用一个新的子串替换所有正则表达式匹配的子串,返回替换后的字符串
replace:替换符合正则表达式的新子串- 最大替换次数
举例
import re
new_str = re.sub(r'\d{5}', 'jas', '123456|654321')
print(new_str)
# jas6|jas1
PS:上面的所有例子我们使用的都是 Re 库的函数式用法,这种函数式用法支持一次性的操作,Re 库还提供了一种面向对象的用法,这种用法支持编译后多次操作。使用方法如下
import re
regex= re.compile(r'\d{5}')
new_str = re.sub(regex, 'jas', '123456|654321')
print(new_str)
上面 regex= re.compile(r'\d{5}') 用于将正则表达式的字符串形式编译成正则表达式对象, 可以帮助我们更好理解正则表达式
四、Match对象
上面有两个方法 re.match(pattern, string, flags) 、re.search(pattern, string, flags) 返回的是一个 Match 对象,这个 Match 对象是什么呢?下面来介绍一下
Match 对象中的属性
string:带匹配的字符串re:匹配时使用的pattern对象(正则表达式)pos:正则表达式搜索文本的开始位置endpos:正则表达式搜索文本的结束位置
Match 对象中的方法
group(0):返回匹配后的字符串start():匹配字符串在原始字符串中的起始位置end():匹配字符串在原始字符串中的结束位置span():匹配字符串在原始字符串中的返回起始与结束位置
例子
import re
pattern = re.compile(r'\d{5}')
match = re.search(pattern, 'f123456g654321')
print(match.re)
print(match.span())
# re.compile('\\d{5}')
# (1, 6)
五、贪婪匹配与最小匹配
我们通过例子来理解什么是贪婪匹配与最小匹配
import re
# '*' 表示匹配前面任意字符且任意个数
pattern = re.compile(r'p.*')
match = re.search(pattern, 'pfds45')
if match:
print(match.group(0))
# pfds45
上面这种方式是贪婪匹配,也是 python 默认的匹配方式
import re
# '*?' 前一个字符 0 次或无限次扩展
pattern = re.compile(r'p.*?')
match = re.search(pattern, 'pfds45')
if match:
print(match.group(0))
# p
上面这种匹配的方式称为最小匹配,因为是最小匹配因此返回匹配的结果是最小的
最小匹配操作符
*?:前一个字符 0 次或无限次匹配+?:前一个字符 1 次或无限次扩展??:前一个字符 0 次或 1 次扩展{m, n}?:扩展前一个字符 m 次至 n 次
本文介绍了正则表达式的基础知识,包括常用操作符、类型、Re库中的主要函数及其使用方法,并探讨了Match对象的概念以及贪婪匹配与最小匹配的区别。
2386

被折叠的 条评论
为什么被折叠?



