python进阶六 正则表达式

一 正则表达式概述

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
相关推荐
三少爷的鞋2 小时前
🚀天下苦阻塞久矣之DeliQueue:Android 17 无锁 MessageQueue 的架构重构
android
qq_413847403 小时前
HTML怎么限制输入字符数_HTML input maxlength属性用法【详解】
jvm·数据库·python
u01091476010 小时前
CSS组件库如何快速扩展_通过Sass @extend继承基础布局
jvm·数据库·python
baidu_3409988210 小时前
Golang怎么用go-noescape优化性能_Golang如何使用编译器指令控制逃逸分析行为【进阶】
jvm·数据库·python
m0_6784854510 小时前
如何利用虚拟 DOM 实现无痕刷新?基于 VNode 对比的状态保持技巧
jvm·数据库·python
qq_3422958210 小时前
CSS如何实现透明背景效果_通过RGBA色彩模式控制透明度
jvm·数据库·python
TechWayfarer10 小时前
知乎/微博的IP属地显示为什么偶尔错误?用IP归属地查询平台自检工具3步验证
网络·python·网络协议·tcp/ip·网络安全
Greyson110 小时前
CSS如何处理超长文本换行问题_结合word-wrap属性
jvm·数据库·python
justjinji10 小时前
如何批量更新SQL数据表_使用UPDATE JOIN语法提升效率
jvm·数据库·python