一 正则表达式概述
1.1 为什么要学习正则表达式
在实际开发过程中经常会有查找符合某些规则的字符串,比如:邮箱、图片地址、手机号码等。想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。

1.2 什么是正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式
1、比如:检索一个串是否含有某种子串(检索)
2、比如:匹配的子串做替换(替换)
3、比如:从一个串中取出符合某个条件的子串(提取)
模式:一种特定的字符串模式,这个模式是通过一些特殊的符号组成的。
正则表达式并不是Python所特有的,在Java、PHP、Go以及JavaScript等语言中都是支持正则表达式的。
1.3 正则表达式的功能
① 数据验证(表单验证、如手机、邮箱、IP地址)
② 数据检索(数据检索、数据抓取) => 爬虫功能
③ 数据隐藏(135****6235 王先生)
④ 数据过滤(论坛敏感关键词过滤)
...
二 re模块
什么是re模块
在Python中需要通过正则表达式对字符串进行匹配时,可使用re模块
re模块使用三步走
第一步:导入re模块
python
import re
第二步:使用match方法进行匹配操作
python
result = re.match(pattern正则表达式, string要匹配的字符串, flags=0)
#flags : 可选,表示匹配模式,比如忽略大小写,多行模式等
第三步:如果数据匹配成功,使用group方法来提取数据
python
result.group()
案例1:
python
def dm01_match():
# """匹配字符: 从大字符串中, 按照规则, 匹配符合条件的子串""
# 1 导入re模块
import re
# 2 使用match方法进行匹配操作
# 2-1 在大的字符串中, 按照规则:"任意1个字符"+"it"+"任意1个字符", 提取符合要求的子串
# 注意: 提取出来的子串一定要符合规则
result = re.match(".it.", "aitcast")
# 2-2 从左到右的匹配(不能跳, 不能从中间匹配), 一个字符一个字符的匹配(此时,结果是:没有找到符合规则的子串)
# result = re.match(".it.", "iloveitcast")
# 3 使用group方法来提取数据
if result:
info = result.group()
print(info)
else:
print("没有找到符合规则的子串")
if __name__ == '__main__':
dm01_match()
输出结果:
python
aitc
案例2:
python
def dm01_match():
# 扫描字符返回第一个成功的匹配 def search(pattern, string, flags=0) '''
import re
result = re.search(
"\d.*",
"city:1beijing2.shanghai") # "\d.*": 数字开头,任意多个字符字符结尾
# result = re.search(".\d.", "cityp.1.beijing2.shanghai")
if result:
print(result.group())
else:
print('没有匹配到')
pass
if __name__ == '__main__':
dm01_match()
结果:
python
1beijing2.shanghai
案例3:
python
def dm01_match():
import re
sentence = "车主说:你的刹车片应该更换了啊,嘿嘿"
# 正则表达式: 去除多余字符
p = r"呢|吧|哈|啊|啦|嘿|嘿嘿"
r = re.compile(pattern=p)
mystr = r.sub('', sentence)
print('mystr-->', mystr)
# 正则表达: 删除除了汉字数字字母和,!?。.- 以外的字符
# \u4e00-\u9fa5 是用来判断是不是中文的一个条件
p = "[^,!?。\.\-\u4e00-\u9fa5_a-zA-Z0-9]"
r = re.compile(pattern=p)
mystr = r.sub('', sentence)
print('mystr-->', mystr)
# 半角变为全角 sentence.replace(",", ",") 逗号 感叹号 问号
sentence = "你好."
mystr = sentence.replace(".", "。")
print('mystr-->', mystr)
if __name__ == '__main__':
dm01_match()
结果:
python
mystr--> 车主说:你的刹车片应该更换了,
mystr--> 车主说你的刹车片应该更换了啊嘿嘿
mystr--> 你好。
三 正则表达式编写
3.1 使用re模块匹配单个字符
| 代码 | 功能 |
|---|---|
| . | 匹配任意1个字符(除了\n) |
| [ ] | 匹配[ ]中列举的字符 |
| [^指定字符] | 匹配除了指定字符以外的所有字符 |
| \d | 匹配数字,即0-9 |
| \D | 匹配非数字,即不是数字 |
| \s | 匹配空白,即 空格,tab键 |
| \S | 匹配非空白 |
| \w | 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字 |
| \W | 匹配特殊字符,即非字母、非数字、非汉字 |
案例1:
python
def dm01_match():
import re
# 1 . 匹配任意1个字符(除了\n)
# 匹配数据: 从左向右匹配,一个字符接着一个字符的匹配
result = re.match("itcast.", "itcast2")
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
结果:
python
itcast2
案例2:
python
def dm01_match():
import re
# 2 [ ] 匹配[ ]中列举的字符
# [a-z] [A-Z] [0-9] [a-zA-Z0-9]
# 匹配数据
result = re.match("itcast[123abc]", "itcast376")
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
结果:
python
itcast3
案例3:
python
def dm01_match():
import re
# 3 \d 匹配数字,即0-9 => [0123456789] => [0-9]
# 匹配数据
result = re.match("itcast\d", "itcast5")
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
结果:
python
itcast5
3.2 使用re模块匹配多个字符
| 代码 | 功能 |
|---|---|
| * | 匹配前一个字符出现0次或者无限次,即可有可无 |
| + | 匹配前一个字符出现1次或者无限次,即至少有1次 |
| ? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
| {m} | 匹配前一个字符出现m次 |
| {m,n} | 匹配前一个字符出现从m到n次 |
案例1:
python
def dm01_match():
import re
# 1 * 匹配前一个字符出现0次或者无限次,即可有可无
result = re.match("itcast1*", "itcast111123333itcast")# 1出现0次或者多次
# result = re.match("itcast\d*", "itcast23333itcast") # 数字出现0次或者多次
# result = re.match("itcast\d*itcast", "itcast123333itcast") # 数字出现0次或者多次 itcast开始 itcast结束
# result = re.match("itcast\d*itcast", "itcastitcast") # 数字出现0次或者多次 itcast开始 itcast结束
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
结果:
python
itcast1111
案例2:
python
def dm01_match():
import re
# 2 + 匹配前一个字符出现1次或者无限次,即至少有1次
# 数字必须出现1次或者多次
result = re.match("itcast\d+itcast", "itcast11333444itcast")
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
结果:
python
itcast11333444itcast
案例3:
python
def dm01_match():
import re
# 3 ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
# 数字出现0次或者1次
result = re.match("itcast\d?itcast", "itcastitcast")
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
python
itcastitcast
案例4:
python
def dm01_match():
import re
# 4 {m} 匹配前一个字符出现m次
result = re.match("itcast\d{2}itcast", "itcast12itcast")
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
结果:
python
itcast12itcast
案例5:
python
def dm01_match():
import re
# 5 {m,n} 匹配前一个字符出现从m到n次
# 注意1:{2, 5} 中括号里面,逗号之后不能加空格
result = re.match("itcast\d{2,5}itcast", "itcast111itcast")
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
python
itcast111itcast
3.3 使用re模块匹配指定字符串开头或者结尾
| 代码 | 功能 |
|---|---|
| ^ | 匹配字符串开头 |
| $ | 匹配字符串结尾 |
案例1:
python
def dm01_match():
import re
# 1-1 ^ 匹配字符串开头
# 匹配数据: 匹配1个数字开头的子串
result = re.match("^\ditcast", "2itcast") # 1 匹配1个数字开头 + itcast
# result = re.match("^\ditcast", "22itcast") # 2 匹配不上
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
结果:
python
2itcast
案例2:
python
def dm01_match():
import re
# 3 匹配以数字为开头以数字为结尾
result = re.match("^\d.*\d$", "11itcast22")
# 获取数据
if result:
info = result.group()
print(info)
else:
print("没有匹配到")
if __name__ == '__main__':
dm01_match()
结果:
python
11itcast22
3.4 使用re模块提取分组数据
| 代码 | 功能 |
|---|---|
| | | 匹配左右任意一个表达式 |
| (ab) | 将括号中字符作为一个分组 |
| \num | 引用分组num匹配到的字符串 |
案例1:
python
def dm01_match():
import re
# 1 需求:在列表中["apple", "banana", "orange", "pear"],匹配apple和pear
fruit = ["apple", "banana", "orange", "pear"]
# 获取字符串数据
for value in fruit:
result = re.match("apple|pear", value)
# 判断匹配是否成功
if result:
info = result.group()
print("我想吃的水果:",value)
else:
print(f"这个不是我想吃的水果{value}")
if __name__ == '__main__':
dm01_match()
结果:
python
我想吃的水果: apple
这个不是我想吃的水果banana
这个不是我想吃的水果orange
我想吃的水果: pear