【全网最全】Python正则表达式详解

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

re 模块

re 模块使 Python 语言拥有全部的正则表达式功能。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

match 基本使用

match(匹配的规则字符串, 目标子符串)

from re import match, search

if __name__ == '__main__':
    pattern = "hello"
    str1 = "hell1word hello"
    # result = match(pattern, str1)
    result = search(pattern, str1)
    print(type(result))
    print(result)
    # print(result.span())  # 返回查找到字符串的索引
    # print(result.group())  # 返回查找到字符串的列表

表示字符

import re

'''
 . 不能匹配换行 \n, \s 可以匹配换行 \n

'''
v = re.match('.','a')
v = re.match('.','1')
v = re.match('.','_')
#返回None
v = re.match('.','\n')
print(v)
v = re.match('\d','1')
print(v)
v = re.match('\D','a1')
print(v)
v = re.match('\s',' ')
v = re.match('\s','\n')
v = re.match('\s','\t')
print(v)
#非空格
v = re.match('\S',' ')
print(v)
v = re.match('\w','a')
v = re.match('\w','A')
v = re.match('\w','1')
v = re.match('\w','_')
print(v)

v = re.match('\W','a')
v = re.match('\W','A')
v = re.match('\W','1')
v = re.match('\W','_')
print(v)

v = re.match('\w\W','1a')
print(v)

表示数量


使用正则表达式表示数量:

*匹配前0个或多个(可有可无)
+匹配前1个或多个
?匹配前1个(可有(有只出现一次)可无)
{n}匹配前字符出现 n 次
{n,}匹配前字符至少出现 n 次
{n,m}匹配前字符出现 m 次到 n 次,限定字符的位数

import re

if __name__ == '__main__':
    # pattern = "\d*"
    # pattern = "\d+"
    # pattern = "\d?"
    pattern = "\d{2,4}"
    s = "123123ab"
    # s = ""
    s = "21abc"
    # v = re.match(pattern, s)
    # print(v)

    # 匹配手机号
    pattern = "1[348]\d{9}"
    s = "13345678901"
    # print(re.match(pattern, s))

    # 匹配变量名 (大写,小写,数字,下划线,只能以字母和下划线开头)
    pattern = "[a-zA-Z_]\w*"
    var = "H_hello_123"
    # print(re.match(pattern, var))

    # 匹配数字 1-99
    pattern = "[1-9][0-9]?"
    num = "0"
    num = "9"
    num = "99"
    print(re.match(pattern, num))

    # 用户名由字母、数字、下划线组成,位数 5,10位之间
    pattern = "[a-zA-Z_]{5,10}"
    s = "_abcaa1111"
    print(re.match(pattern, s))

原始字符串

Python 中字符串前边加 r 表示原生字符串

import re

if __name__ == '__main__':
    s = '\n123'
    print(s)
    s = r'\n123'
    print(s)
    s = '\\n123'
    print(s)
    # pattern = '\\\\n\d{3,}'
    pattern = r'\\n\d{3,}'
    v = re.match(pattern, s)
    print(v)

边界

import re

if __name__ == '__main__':
    # $ 表示匹配结尾
    # 匹配 163 邮箱
    pattern = "1[389]\w{9}@163.com$"
    s = "13856123451@163.com"
    print(re.match(pattern, s))

    # \b 匹配单词结尾
    pattern = r"\w*er\b"
    pattern = r"\bHello_\w*"
    pattern = r"\bhttp://www.\w*.com"
    s = "zwzwer"
    s = "Hello_1232ljj"
    s = "https://www.baidu.com"
    print(re.match(pattern, s))

分组

匹配 [0,100] 之间的数

pattern = r"[1,9]?\d$|100$"  # 注意: | 前后不能有空格,否则当做匹配的规则
s = "0"
s = "99"
s = "100"
v = re.match(pattern, s)
print(v)

匹配数字 0001-11233

pattern = r"(\d{4})-([1-9]\d{4})$"
s = "0001-11111"
v = re.match(pattern, s)
print(v)
print(v.group())
print(v.group(1))
print(v.group(2))
print(v.groups())

匹配 <html><title>我是标题哈</title></html>

# pattern = r"<.+><.+>.+</.+></.+>"
pattern = r"<(.+)><(.+)>.+</\2></\1>"
# s = "<html><title>我是标题哈</head></body>"
s = "<html><title>我是标题哈</title></html>"
v = re.match(pattern, s)
print(v)
print(v.group())
print(v.group(1))
print(v.group(2))
print(v.groups())

匹配 <h2><font>我是2级标题</font></h2>

pattern = "<(?P<h>.+)><(?P<font>.+)>.+</(?P=font)></(?P=h)>"
s = "<h2><p>我是2级标题</p></h2>"
v = re.match(pattern, s)
print(v)
print(v.group())
print(v.groups())
print(v.group('h'))
print(v.group('font'))

正则表达式高级用法


match:从目标字符串的开头,进行匹配
search: 遍历目标字符串,查找第一个符合匹配规则的子符串
findall: 遍历目标字符串,查找所有符合匹配规则的子符串
sub: 遍历目标字符串,查找所有符合匹配规则的子符串并替换
split: 按照匹配规则,分割目标字符串为列表

import re

if __name__ == '__main__':
    s = "点赞量为:99次,转发量为:10次,评论数为:9次"

    pattern = r"\d+"

    v = re.search(pattern, s)
    print(v)
    list1 = re.findall(pattern, s)
    print(list1)
    print("======================s")

    """
        字符串替换
    """


    def replace(result):
        """ 替换匹配成功字串内容 """
        # print(result)
        # print(result.group())
        return str(int(result.group()) + 10)


    # count=0 表示替换所有符合条件的子串
    # count=1 表示替换第一次匹配成功后,替换该子串,后面符合条件的字串不替换
    # count=n(n>=1) 表示替换前n次匹配成功后,替换该子串,后面符合条件的字串不替换
    # new_str = re.sub(pattern, '100', s, count=2)
    new_str = re.sub(pattern, lambda x: str(int(x.group()) + 10), s, count=2)
    print(new_str)

    print("======================")

    """
        根据正则表达式拆分字符串
    """
    test = "HelloWorld!Python:大法好;优秀 哈"
    list_split = re.split(r'\s|!|:|;', test)
    print(list_split)

贪婪模式与非贪婪模式

  • 什么是贪婪模式?

Python 里数量词默认是贪婪的, 总是尝试匹配尽可能多的字符

  • 什么是非贪婪

与贪婪相反,总是尝试匹配尽可能少的字符,可以使用"*“,”?“,”+“,”{m,n}"后面加上?,使贪婪变成非贪婪

贪婪模式: 默认是贪婪模式,在满足条件的前提下,尽可能多的匹配子串
非贪婪模式: 增加 ? ,在满足条件的前提下,尽可能少的匹配子串

from re import match

if __name__ == '__main__':

    # 匹配 My telephone is 011-1232-1231
    s = "My telephone is 011-1232-1231"

    pattern = "(.+?)(\d+)-(\d+)-(\d+?)"
    v = match(pattern, s)
    print(v.group())
    print(v.groups())


    s = "aaabb123"
    pattern = r"(\w+?)([1-9]+)"
    v = match(pattern, s)
    print(v.group())
    print(v.groups())

好了,今天的分享就到这里了~

如果你对Python感兴趣的话,可以试试我整理的这份Python全套学习资料,0基础入门+进阶实战,你想要的我们都有。微信扫码免费领取

包括:Python永久使用安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。带你从零基础系统性的学好Python!

零基础Python学习资源介绍

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python学习软件

工欲善其事,必先利其器。学习Python常用的开发软件都在这里了!
在这里插入图片描述

三、Python入门学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

四、Python练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

五、Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。这份资料也包含在内的哈~在这里插入图片描述

六、Python面试资料

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

七、资料领取

上述完整版Python全套学习资料已经上传CSDN官方,需要的小伙伴可自行微信扫描下方CSDN官方认证二维码免费领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值