还没搞懂正则?熬夜到虚脱整理出来的Python的正则表达式总结(Regular Expression)

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还没搞懂正则?熬夜到虚脱整理出来的Python的正则表达式总结(Regular Expression)相关的知识,希望对你有一定的参考价值。

前言:

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

一. 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的正则表达式总结(Regular Expression)的主要内容,如果未能解决你的问题,请参考以下文章

还没搞懂async和await?看完这篇还不懂的话你来静步我

还没搞懂async和await?看完这篇还不懂的话你来静步我

加班熬夜整理出来的100道Python基础题,学到就是赚到!超级详细

你还没搞懂this?

升级过log4j,却还没搞懂log4j漏洞的本质?

还没搞懂JVM吗?95%的技术面试必问知识点都在这,还怕面不过?