【全网最全】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官方认证二维码免费领取
更多推荐
所有评论(0)