[Python][华为云Python编程创造营][学习笔记][10_Python正则表达式]

举报
John2021 发表于 2021/11/10 19:37:03 2021/11/10
【摘要】 1,正则表达式    - 正则表达式(Regular Expression)在诸多编程语言中都是较为重要的一部分。它是一个由特殊字符组成的字符串,这个特殊的字符串描述了匹配一系列字符的规则。    - 正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。    - 大多数编程语言中正则表达式的书写形式和规则是一样的。2,正则表达式的执行流程    - 正则表达式的...

1,正则表达式

    - 正则表达式(Regular Expression)在诸多编程语言中都是较为重要的一部分。它是一个由特殊字符组成的字符串,这个特殊的字符串描述了匹配一系列字符的规则。
    - 正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。
    - 大多数编程语言中正则表达式的书写形式和规则是一样的。

2,正则表达式的执行流程

    - 正则表达式的大致匹配过程是:依次将文本中的字符和正则表达式做匹配,如果所有字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。

    img.png

3,特殊符号和字符 - 符号

'''
    表示法:re1|re2
    描述:匹配正则表达式re1或者re2
    匹配的表达式:res=re.search("foo|bar","xxxfooxxx")
    预期输出结果:foo
'''
import re
res=re.search("foo|bar","xxxfooxxx")
print(res.group())  # foo
'''
    表示法:.
    描述:匹配任何字符(除\n之外)
    匹配的表达式:res=re.search("b.b","xxxbobxxx")
    预期输出结果:bob
'''
import re
res=re.search("b.b","xxxbobxxx")
print(res.group())  # bob
'''
    表示法:^
    描述:匹配字符串起始部分
    匹配的表达式:res=re.search("^b.b","bobx xx")
    预期输出结果:bob
'''
import re
res=re.search("^b.b","bobx xx")
print(res.group())  # bob
'''
    表示法:$
    描述:匹配字符串结尾部分
    匹配的表达式:res=re.search("b.b$","xx xbob")
    预期输出结果:bob
'''
import re
res=re.search("b.b$","xx xbob")
print(res.group())  # bob
'''
    表示法:*
    描述:匹配0次或者多次前面出现的正则表达式(从字符串开头匹配)
    匹配的表达式:res=re.search("bob*","bobbo")
                res1=re.search(".*","bobbobdd")
    预期输出结果:bobb
                bobbobdd
'''
import re
res=re.search("bob*","bobbo")
res1=re.search(".*","bobbobdd")
print(res.group())  # bobb
print(res1.group())  # bobbobdd
'''
    表示法:+
    描述:匹配1次或者多次前面出现的正则表达式
    匹配的表达式:res=re.search("bob+","xxxxbobbbbob")
    预期输出结果:bobbbb
'''
import re
res=re.search("bob+","xxxxbobbbbob")
print(res.group())  # bobbbb
'''
    表示法:?
    描述:匹配0次或者1次前面出现的正则表达式
    匹配的表达式:res=re.search("bob?","bobbob")
    预期输出结果:bob
'''
import re
res=re.search("bob?","bobbob")
print(res.group())  # bob
'''
    表示法:{N}
    描述:匹配N次前面出现的正则表达式
    匹配的表达式:res=re.search("bob{2}","bobbbbob")
    预期输出结果:bobb
'''
import re
res=re.search("bob{2}","bobbbbob")
print(res.group())  # bobb
'''
    表示法:{M,N}
    描述:匹配M到N次前面出现的正则表达式
    匹配的表达式:res=re.search("bob{2,3}","bobbbbob")
    预期输出结果:bobbb
'''
import re
res=re.search("bob{2,3}","bobbbbob")
print(res.group())  # bobbb
'''
    表示法:[...]
    描述:匹配来自字符集的任意单一字符
    匹配的表达式:res=re.search("[b,o,b]","xxbobxx")
    预期输出结果:b
'''
import re
res=re.search("[b,o,b]","xxbobxx")
print(res.group())  # b
'''
    表示法:[...X-Y...]
    描述:匹配x-y范围中任意单一字符
    匹配的表达式:res=re.search("[a-z]","xxbobxx")
    预期输出结果:x
'''
import re
res=re.search("[a-z]","xxxbobxxx")
print(res.group())  # x
'''
    表示法:[^...]
    描述:不匹配字符串中任何一个字符,包括某一范围的字符
    匹配的表达式:res=re.search("[^a-z]","xx214bobxx")
                res1=re.search("[^2,x,1]","xx214bobxx")
    预期输出结果:2
                4
'''
import re
res=re.search("[^a-z]","xx214bobxx")
res1=re.search("[^2,x,1]","xx214bobxx")
print(res.group())  # 2
print(res1.group())  # 4
'''
    表示法:(*|+|{})?
    描述:用于匹配频繁出现或者重复出现的符号的非贪婪版本
    匹配的表达式:res=re.search(".[+|?]?[1-9]","ds4b")
    预期输出结果:s4
'''
import re
res=re.search(".[+|?]?[1-9]","ds4b")
print(res.group())  # s4

4,特殊符号和字符 - 字符

'''
    表示法:\w
    描述:匹配字母数字及下划线
'''
import re
str_="996.ICU指工作996、生病ICU,也就是工作从早上9点上班到晚上9点下班,每周工作6天,生病了就住进ICU"
num1=re.findall(r"\w+",str_)
print(num1)  # ['996', 'ICU指工作996', '生病ICU', '也就是工作从早上9点上班到晚上9点下班', '每周工作6天', '生病了就住进ICU']

'''
    表示法:\W
    描述:匹配非字母数字及下划线
'''
import re
str_="996.ICU指工作996、生病ICU,也就是工作从早上9点上班到晚上9点下班,每周工作6天,生病了就住进ICU"
num1=re.findall(r"\W+",str_)
print(num1)  # ['.', '、', ',', ',', ',']
'''
    表示法:\s
    描述:匹配任意空白字符,等价于[\t\n\r\f]
'''
import re
str_="一二三四五,上山打老虎,老虎打不到,打到小松鼠"
res=re.findall(r"\s+",str_)
print(res)  # []
'''
    表示法:\S
    描述:匹配任意非空字符
'''
import re
str_="一二三四五,上山打老虎,老虎打不到,打到小松鼠"
res=re.findall(r"\S+",str_)
print(res)  # ['一二三四五,上山打老虎,老虎打不到,打到小松鼠']
'''
    表示法:\d
    描述:匹配任意数字,等价于[0-9]
'''
import re
str_="996.ICU指工作996、生病ICU,也就是工作从早上9点上班到晚上9点下班,每周工作6天,生病了就住进ICU"
num1=re.findall(r"\d+",str_)  # \d匹配数字,+匹配多次
print(num1)  # ['996', '996', '9', '9', '6']
'''
    表示法:\D
    描述:匹配任意非数字
'''
import re
str_="996.ICU指工作996、生病ICU,也就是工作从早上9点上班到晚上9点下班,每周工作6天,生病了就住进ICU"
num1=re.findall(r"\D+",str_)  # \d匹配数字,+匹配多次
print(num1)  # ['.ICU指工作', '、生病ICU,也就是工作从早上', '点上班到晚上', '点下班,每周工作', '天,生病了就住进ICU']

5,常见的正则表达式

'''
    描述:n位数字
    匹配的表达式:^\d{n}$

    描述:汉字
    匹配的表达式:^[\u4e00-\u9fa5]{0,}$

    描述:英文和数字
    匹配的表达式:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

    描述:匹配英文字母
    匹配的表达式:^[A-Za-z]+$

    描述:中文、英文、数字包括下划线
    匹配的表达式:^[\u4E00-\u9FA5A-Za-z0-9_]+$

    描述:邮箱
    匹配的表达式:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

    描述:域名
    匹配的表达式:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

    描述:URL
    匹配的表达式:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

    描述:手机号码
    匹配的表达式:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

    描述:身份证匹配
    匹配的表达式:^\d{15}|\d{18}$
'''

6,贪婪匹配

    - 当正则表达式中包含能接受到重复的限定符时,通常的行为是匹配尽可能多的字符,这种匹配方式叫做贪婪匹配。特征是一次性读入整个字符串进行匹配,
        每当不匹配就舍弃最右边一个字符,继续匹配,依次匹配和舍弃,直到匹配成功或者把整个字符串舍弃为止,因此它是一种最大化数据返回。
        res=re.search(r"(\d+)","Python955wlb").group(1)  # 955

7,非贪婪(懒惰)匹配

    - 当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能少的字符,这种匹配方式叫做懒惰匹配。
    - 特征:从左到右,从字符串的最左边开始匹配,每次试图不读入字符匹配,匹配成功,则完成匹配,否则读入一个字符再匹配,依次循环(读入字符,匹配)直到匹配成功或者把字符串的字符匹配完为止。
        res=re.search(r"(\d+?)","Python955wlb").group(1)  # 955

8,正则表达式注意事项

    - 转义字符 /:如果在表达式中需要匹配一些有特殊意义的字符,可以使用转义字符(如:"//",匹配/)。
    - 原始字符串 r:要匹配多个/,可以使用r。
    - 非贪婪操作符 ?:在表达式中使用"?"可以让表达式尽可能少的去匹配,实现非贪婪模式。

9,re模块

    - 在Python中通过正则表达式对字符串进行匹配的时候,需要使用标准库re模块。
    - re模块中通过给定的匹配规则,匹配文本中符合规则的字符进行操作。
    - 匹配规则可以是字符串,也可以是正则表达式。
    - 字符串操作:
        分割,替换,查找。
    - re模块常用匹配方法

'''
    函数/方法:match(pattern,string,flag=0)
    描述:匹配以给定限制开头的字符串
'''
import re
res=re.match("www","www.python.org")
print(res.group())  # www
res1=re.match("www","p.www.python.org")
print(res1.group())  # AttributeError: 'NoneType' object has no attribute 'group'
'''
    函数/方法:search(pattern,string,flag=0)
    描述:在整个字符串中寻找匹配规则的字符串
'''
import re
res=re.search("www","p.www.python.org")
print(res.group())  # www
'''
    函数/方法:findall(pattern,string,flag=0)
    描述:查找字符串中所有出现的正则表达式模式,返回列表
'''
import re
res=re.findall("w","wasdw")
print(res)  # ['w', 'w']
'''
    函数/方法:sub(pattern,string,flag=0)
    描述:将选中的字符串替换为给定的字符串
'''
import re
res=re.sub(r"\d+","997","Python=996")
print(res)  # Python=997
'''
    函数/方法:split(pattern,string[,maxsplit=0,flags=0])
    描述:根据给定字符串切分字符串
'''
import re
res=re.split("\.","www.huawei.com")
print(res)  # ['www', 'huawei', 'com']
'''
    函数/方法:compile(pattern[,flags])
    描述:编译正则表达式,获得一个正则表达式对象
'''
import re
pattern=re.compile(r"\d+")
res=pattern.search("www.996icu.com")
print(res)  # <re.Match object; span=(4, 7), match='996'>

    - 常用的匹配对象方法

'''
    函数/方法:group(num=0)
    描述:返回整个匹配对象,或者编号为num的特定子组
'''
import re
res=re.search("([0-9]*)([a-z]*)([0-9]*)","123abc456")
print(res.group())  # 123abc456
print(res.group(1))  # 123
print(res.group(2))  # abc
print(res.group(3))  # 456
'''
    函数/方法:groups(default=None)
    描述:返回一个包含所有子组的元组
'''
import re
res=re.search("(\w\w\w)-(\d\d\d)","abc-123")
print(res.groups())  # ('abc', '123')
'''
    函数/方法:groupdict(default=None)
    描述:返回一个包含所有匹配的命名子组的字典,子组名称为键值
'''
import re
res=re.search("(?P<lamb>\w\w\w)-(?P<num>\d\d\d)","abc-123")
print(res.groupdict())  # {'lamb': 'abc', 'num': '123'}
'''
    函数/方法:re.i,re.IGNORECASE
    描述:不区分大小写
'''
import re
res=re.search("abc","aBcxx",re.I)
print(res.group())  # aBc
'''
    函数/方法:re.M,re.MULTILINE
    描述:^和$分别匹配目标字符串的起始和结尾,而不是严格匹配字符串本身的起始和结尾
'''
import re
res=re.search("^aB","aBcxx",re.M)
print(res.group())  # aB
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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