Python的正则表达式总结【生长吧!Python】

举报
神的孩子在歌唱 发表于 2021/06/29 14:54:50 2021/06/29
【摘要】 前言:作者:神的孩子在歌唱这是我听老师讲课做的笔记大家好,我叫陈运智,大家可以叫我智 一. python正则表达式介绍正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。compile 函数根据一个模式字符串和可选的标志...

前言:

作者:神的孩子在歌唱
这是我听老师讲课做的笔记
大家好,我叫陈运智,大家可以叫我

一. python正则表达式介绍

  1. 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

  2. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

  3. re 模块使 Python 语言拥有全部的正则表达式功能。

  4. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换

  5. re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

二. re模块

2.1 match方法

re.match 尝试从字符串的起始位置匹配一个规则,匹配成功就返回match对象,否则返回None。可以使用group()获取匹配成功的字符串。

  1. 语法:re.match(pattern, string, flags=0)
  2. 参数说明:
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
  1. 我们可以使用group(num)groups() 匹配对象函数来获取匹配表达式。
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
  1. 代码演示
'''
修饰符	描述
re.I	使匹配对大小写不敏感
re.L	做本地化识别(locale-aware)匹配
re.M	多行匹配,影响 ^ 和 $
re.S	使 . 匹配包括换行在内的所有字符
re.U	根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X	该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
'''

在这里插入图片描述

输出:
在这里插入图片描述

2.2 匹配规则

2.2.1 匹配字符

符号 匹配规则
.(点) 匹配任意1个字符除了换行符\n
[abc ] 匹配abc中的任意一个字符
\d 匹配一个数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即空格,tab键
\S 匹配非空白,除空格,tab键之类的
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符
  1. .点的使用,匹配除了换行符之外的任意一个字符字符,还可以.*输出后面的字符串
import re
data='python'
parrtern='..'#匹配规则,这里匹配两个字符
res=re.match(parrtern,data)
print(res.group())#输出:py
'''测试二'''
names='运智在学习python','运气','换人'
pattern='运.'#匹配规则:会匹配运开头的
for item in names:
    chen=re.match(pattern,item)
    if chen:
        print(chen.group())#输出运智,运气

输出:
在这里插入图片描述
2. [] 中括号:匹配中括号中的任意一个字符

str1='hello'
res=re.match('[he]',str1)
print(res.group())#输出:h

2.2.2 分组匹配

符号 匹配规则
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

代码按例:

在这里插入图片描述

2.2.3 限定匹配字符规则

原理:就是匹配数量

符号 匹配规则
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{n,m} 匹配前一个字符出现从n到m次
  1. * 匹配前一个字符出现0次或者无限次,即可有可无
    代码:
res=re.match('[A-Z]*','Cy')#匹配0次
print(res.group())#C
res=re.match('[A-Z][a-z]*','Che')#也可以写成" [A-Za-z]* "
print(res.group())
# re.match('[a-zA-Z]+[\w]*','na99m_e')
#re.match('\d{4}','1234')#精确匹配

输出:

在这里插入图片描述
2. 代码按例匹配邮箱

regexMail=re.match('[a-zA-Z0-9]{6,11}@qq.com','chenyunzhi@qq.com')
if regexMail:
    print('匹配成功{}'.format(regexMail.group()))
    pass

输出:
在这里插入图片描述

2.2.4 转义字符

符号 匹配规则
^ 匹配字符串开头
$ 匹配字符串结尾
import re
# 在正则前加r,表示原生字符串,python字符串不转义 或者直接\\\\a。
print(re.match(r'c:\\a.txt','c:\\a.txt').group())#c:\a.txt

dt='python is chen'
result=re.match('^p.*',dt)#开头是对的就输出
chen=re.match('^p\w{5}',dt)
End=re.match('\w{5,12}@[\w]{1,9}.\w{3}$','chenyunzhi@qq.com')
if result:
    print(result.group())#python is chen
    print(chen.group())#python
    print(End.group())#chenyunzhi@qq.com

输出:
在这里插入图片描述

三. re中的编译函数

3.1 compile方法

  1. compile 可以把一个字符串编译成字节码
  2. 优点:在使用正则表达式进行match的操作时,python会将字符串转为正则表达式对象,
  3. 而如果使用compile只需要一次转换,以后再使用模式对象的话 无需转换
import re
rs=re.compile('\w.*')
res=rs.match('chenyunzhi')
print(res.group())#输出:chenyunzhi

3.2 search方法

  1. search在全文中匹配一次,匹配到就返回
  2. 语法:re.search(pattern, string, flags=0)
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
  1. 代码
'''
print(re.search('python','人生苦短,我用python').group())
#输出:python

3.3 finall方法

  1. finall():查询字符串某个正则表达式全部非重复出现的情况 返回是一个符合正则表达式的结果列表
  2. 语法:findall(string[, pos[, endpos]])
参数 描述
string 待匹配的字符串。
pos 可选参数,指定字符串的起始位置,默认为 0。
endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

3.代码

print(re.findall('p','python的开头是p'))#输出:['p', 'p']

小结:search找到就返回,finall全部找到才返回

3.4 sub方法

  1. sub:将匹配到的数据进行替换,实现目标的搜索查找
  2. 语法:sub(pattern, repl, string, count=0, flags=0)
参数 描述
pattern 正则中的模式字符串。
repl 替换的字符串,也可为一个函数。
string 要被查找替换的原始字符串。
count 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags 标志位,用于控制正则表达式的匹配方式
  1. 代码

在这里插入图片描述

输出:
在这里插入图片描述

3.5 split方法

  1. split:实现分割字符串,以列表形式返回
  2. 语法:split(pattern, string, maxsplit=0, flags=0)
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags 标志位,用于控制正则表达式的匹配方式
print(re.split(',','chen,yun,zhi'))#输出:['chen', 'yun', 'zhi']

四. 贪婪模式与非贪婪模式

默认条件下为贪婪模式

  1. 贪婪:在满足条件情况下尽可能匹配到数据
  2. 非贪婪满足条件就可以,在"*","?","+","{m,n}"后面加上,就能将贪婪变成非贪婪.

代码

#贪婪模式
pattern=re.compile('a.*b')
result=pattern.search('abcabcd')
print(result.group())#abcab

#非贪婪
pattern=re.compile('a.*?b')
result=pattern.search('abcabcd')
print(result.group())#ab

输出:

abcab
ab

上面可以看出,贪婪模式要匹配到最后一个b才停止,然而非贪婪模式匹配到第一个b就停止了

本人博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。

请给我点个赞鼓励我吧
在这里插入图片描述

【生长吧!Python】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/278897

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。