Python 正则表达式学习日记

python正则表达式模块引入

正则表达式的目的

  • 数据挖掘
    从一大堆文本呢中找到所需要的文本内容,比如在网站爬虫的时候找到所需要的图片等等。
  • 验证
    当有用户在你设置的应用程序进行登陆时,可以使用正则确认所获取的数据是否填写规范等等。

正则的使用

  • 指定一个匹配规则,识别该规则是否存在一个文本字符串中;
  • 正则表达式可以识别匹配文本是否存在;
  • 可以将一个规则分解为多个子规则,并展示每个子规则匹配的文本。

正则的优缺点:

  • 优点:提高工作效率,节省代码
  • 缺点:复杂难以理解
    一般如果可以用更简单的方法进行字符串的匹配就最好不要用正则

re — python 的标准库

re模块就是python中自带的正则模块,可以用于从文本中匹配需要的文本内容。这个是python的标准库,无需自己安装。
想看更多详情请关注:
官方文档

re模块的基本用法

  1. match
  • 从字符串头查找匹配项;
  • 接收一个正则表达式和字符串,从字符串的第一个字符开始匹配,并返回发现的第一个能够匹配的内容;
  • 如果字符串从开头就不符合正则表达式,则匹配失败,re.match返回None.
ret = re.match(r"ame","psg.lgd.ame maybe chalice fy xnova")
print(ret)
'''
输出结果为 None
因为match匹配的话要求字符串从开头就要是预备匹配的字符
'''
ret = re.match(r"ame","ame maybe chalice fy xnova")
print(ret)
'''
输出结果为: <re.Match object; span=(0, 3), match='ame'>
span : 是匹配到的字符串索引值的区域  下标索引是 0,1,2
如果想要输出匹配到的字符串则是下面语句
'''
print(ret.group())
'''
输出结果为 ame
group 是由于正则表达式可以分拆为多个匹配到的子组
0 是group的默认参数,表示匹配的整个串,n表示第n个分组
然后还有一个和 group 对应的 groups 函数,表示输出从1到所含的小组号
'''
print(ret.groups())
"""
这里输出的结果为: () 
因为match只会匹配到一个需要的文本内容就会退出,所以下标值只有0,没有超过1的内容
"""

此外 match 还有 start() 和 end() 函数,其返回的结果就是匹配到字符串的起始下标和结束下标。

  1. search
  • 查找匹配项;
  • 接收一个正则表达式和字符串,并返回匹配到的第一个值;
  • 如果整个字符串都没有能够匹配到的内容,re.search返回None.
'''
search 的用法与 match 基本一致
只不过需要注意的是
match 是必须从字符串首个字符开始匹配
search 是从前到后匹配字符串中第一个能匹配上的字符段
'''
ret = re.search(r"ame","psg.lgd.ame maybe chalice fy xnova")
print(ret)
print(ret.group())
"""
输出内容为:
<re.Match object; span=(8, 11), match='ame'>
ame
"""
  1. findall
  • 接收两个参数,第一个参数是正则表达式,第二个是字符串,会查询字符串内所有能匹配上的内容,并返回一个列表。
ret = re.findall(r"python", "Python3 python3 mpython fython typython")
print(ret)
"""
输出结果为: ['python', 'python', 'python']
findall 如这个函数的名字,会找到所有能够匹配上的字符串,不管目标内容处于何种位置。
并且结果是用列表对其进行表示的,这个方法比较常用
"""
  1. sub
  • 接收三个参数,(‘匹配正则’,‘替换内容’,‘string’);
  • 会将 string 中匹配的内容替换成你设置好的替换内容。
msg = "I'm learning python!"
print(re.sub(r"learn", "LEARN", msg))
# 输出内容:I'm LEARNing python!

基本正则匹配

  • 区间:[ ]
 - 正则匹配区分大小写
import re
ret = re.findall(r'Ame',"ame amexxxx Axx Ame")
print(ret)
# 输出内容 ['Ame']
ret = re.findall(r'[Aa]me',"ame amexxxx Axx Ame")
print(ret)
# 输出内容 ['ame','ame','Ame']
 - 匹配所有字母: [a-zA-Z]
 - 匹配所有字母和数字: [a-zA-Z0-9]
  • 匹配或 语法 —— 匹配规则1|匹配规则2
 - 匹配 cat 或者 dog
msg = "It's raining cats and dogs"
ret = re.search("cat|dog", msg)
print(ret.group())
# 输出结果 cat
ret = re.findall("cat|dog", msg)
print(ret)
# 输出结果 ['cat', 'dog']
  • 区间取反 —— [^abc]
 - 匹配 a + 非小写字母 字符
ret = re.findall("a[^a-z]", "abda13kal23jla9")
print(ret)
# 输出结果 ['a1', 'a9']
  • 任意字符:"."占位符
 - "." 表示出了\n 之外的任意字符  表示的是一定要有一个字符
ret = re.findall("p.thon", "python pathon  ppthon p-thon Python pthon")
print(ret)
# 输出结果 ['python', 'pathon', 'ppthon', 'p-thon']

正则的快捷匹配方式

在这里插入图片描述
上述功能就不展示了,感兴趣可以自行测试体验。

基本正则匹配 - 开头与结尾

开始与结束:^, $

 - 匹配以python开头:^python 
ret = re.findall(r"^python", "python3#  python  python")
print(ret)
# 输出结果为 python
 - 匹配以python结尾:python$
ret = re.findall(r"python$", "python3#  python  python")
print(ret)
# 输出结果为 python

正则重复 – 通配符

在这里插入图片描述
补充一个通配符:"{n,m}"
匹配指定的字符组出现n次到m次

ret = re.findall("p{2,4}", "ppppythonppppp")
print(ret)
# 输出结果为 ['pppp', 'pppp']

基本正则匹配 – 贪婪与非贪婪模式

这是正则匹配中比较重要的一个部分
首先解释什么是贪婪模式与非贪婪模式

  • 贪婪模式(.*):匹配尽可能多的字符 ==> 一般默认的匹配模式都是贪婪模式;
  • 非贪婪模式(.*?):只要匹配到相应的内容就会退出。
 - 演示一遍
msg = "sanchuang  hello world 123 tongle 123"
ret = re.findall("s.*123", msg)
print(ret)
"""
这一块的输出内容为 ['sanchuang  hello world 123 tongle 123']
它默认会去找到最长的一个字符串进行输出,这就是贪婪模式(默认就是贪婪模式)
"""
ret = re.findall("s.*?123", msg)
print(ret)
"""
这一块的输出内容为 ['sanchuang  hello world 123']
只要匹配到相应的内容就会退出,这就是非贪婪模式
"""
ret = re.findall("p{2,4}", "ppppythonppppp")
print(ret)
"""
这一块的输出内容为 ['pppp', 'pppp']
这里匹配的内容是四个p 因为是默认的贪婪模式匹配,它会尽量匹配到多的字符串内容,所以能匹配 4 个 p 它就不会匹配 3 个 p
"""
ret = re.findall("p{2,4}?", "ppppythonppppp")
print(ret)
"""
这一块的输出内容为 ['pp', 'pp', 'pp', 'pp']
因为 ? 是非贪婪模式,当它匹配到两次 p 已经满足要求了,就会立马把结果输出,再进行下一次的内容匹配
"""

正则表达式的大部分重要内容到这里就结束了;
如果想了解更多欢迎留言。
也欢迎来访 三创 一起学习。

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wx-zhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值