python正则表达式用法超详细讲解大全

 更新时间:2022年10月10日 09:16:11   作者:YZL40514131  
正则表达式是一种用来匹配字符串的强有力的武器,利用字符来匹配字符的思想,基于显示规则进行模式匹配,可以高效组合成不同样式的字符串,下面这篇文章主要给大家介绍了关于python正则表达式用法超详细讲解的相关资料,需要的朋友可以参考下

一、re.compile 函数

作用:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

案例:如何判断是正规的手机号

phone='''
weref234
16888888888
as13423423
weq
435435
15812312312e
afa15812312316
13111111111
'''

pattern=re.compile(r'1[3-9]\d{9}')  	#todo 编译正则表达式之后得到一个编译对象

result=pattern.search(phone)   			#todo search只会返回第一个匹配的结果,如果没有匹配成功返回None
print(result)                   		#todo <re.Match object; span=(10, 21), match='15812312312'>

打印结果:

<re.Match object; span=(10, 21), match=‘16888888888’>
16888888888
(10, 21)

🔥🔥🔥特别注意1

result=pattern.search(phone):search匹配成功返回的是Match对象;search只会返回第一个匹配的结果,如果没有匹配成功则返回None
result.group():返回第一个匹配结果
result.span():返回第一个匹配结果的下标,为什么是(10,21)呐?
weref234:从0开始,4结束后还包含了换行符’/n’2个字符,所以从10开始,不包含21,前闭后开的原则

🔥🔥🔥特别注意2

match函数:match匹配成功返回的是Match对象;作用用来匹配第一个注意是第一个字符的,这里的第一个是在被搜索的这串字符的第一个索引上的;如果第一个字符不匹配,则返回None

phone='''
weref234
16888888888
as13423423
weq
435435
15812312312e
afa15812312316
13111111111
'''

pattern=re.compile(r'1[3-9]\d{9}')     #todo 编译正则表达式之后得到一个编译对象
result2=pattern.match(phone)
print(result2)

打印结果为None,因为第一个字符为w开头,所以匹配不到

phone1="17812312345aaa"
pattern=re.compile(r'1[3-9]\d{9}')     #todo 编译正则表达式之后得到一个编译对象

result2=pattern.match(phone1)   #todo match函数是从第一个字符开始匹配(从w开始匹配),如果第一个字符不匹配,则返回None
print(result2)
print(result2.group())   #todo 返回第一个匹配结果
print(result2.span())    #todo 返回第一个匹配结果的下标

打印结果:

<re.Match object; span=(0, 11), match=‘17812312345’>
17812312345
(0, 11)

二、正则表达式

表示字符

.:匹配任意单个字符(不包括换行符)
[]:匹配字符集,区间中的集合,可匹配其中任意一个字符
\d:匹配数字,即0-9,可以表示为[0-9]、
\s:匹配空白字符,即空格
\S:匹配非空白字符,
\w:匹配单词字符,即a-z、A-Z、0-9、_
\W:匹配非单词字符

import re
#.匹配任意单个字符(不包括换行符)
one='123a'
res=re.match('.',one)
print(res.group())

#[]:匹配字符集,区间中的集合,可匹配其中任意一个字符
two='8'
res1=re.match('[0-9]',two)   #匹配1-9之间的数字
print(res1.group())

res2=re.match('[0,1,8,9]',two)  #匹配0、1、8、9之间的数字
print(res2.group())

two_2='Hello Python'
print(re.match('[hH]',two_2).group())    #匹配小写或大写H

#\d:匹配数字,即0-9,可以表示为[0-9]
three='天空1号发射成功'
print(re.match('天空\d',three).group())
print(re.search('\d',three).group())

表示数字

*:匹配前一个字符出现0次或者无限次,即可有可无
+:匹配前一个字符出现1次或者无限次,即至少有1次
?:匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m}:匹配前一个字符出现m次
{m,}:匹配前一个字符至少出现m次
{m,n}:匹配前一个字符出现从m到n次

需求1:匹配一个字符串第一个字母是大写,后面的字母必须是小写或者没有

print(re.match('[A-Z][a-z]*','Mn').group())
print(re.match('[A-Z][a-z]*','Msdfsg').group())
print(re.match('[A-Z][a-z][a-z]','Msdfs').group())

Mn
Msdfsg
Msd

需求2 匹配一个变量名,

print(re.match(r'[a-zA-Z_]+[\w]*','name1').group())
print(re.match(r'[a-zA-Z_]+[\w]*','_name1').group())
print(re.match(r'[a-zA-Z_]+[\w]*','2_name1'))

name1
_name1
None

需求3:匹配0-99之间的任意一个数字

print(re.match('[0-9]?[0-9]','88').group())
print(re.match('[0-9]?[0-9]','8').group())
print(re.match('[0-9]?[0-9]','08').group())
print(re.match('[0-9]?[0-9]','888').group())

88
8
08
88

需求4:匹配密码(8-20位,可以是大小写的字母、数字、下划线)

print(re.match('[a-zA-Z0-9_]{8,20}','12345678').group())
print(re.match('[a-zA-Z0-9_]{8}','12345678').group())

12345678
12345678

匹配边界

^:表示以什么开头
$:表示以什么结尾
\b:表示匹配单词的边界
|:或者

需求5:匹配163的邮箱地址,邮箱的用户名包含6~18个字符,可以是数字、字母、下划线、但是必须以字母开头,.com结尾

emails='''
    awhaldc@163.com
asdasdfddasdfascvdfgbdfgdsds@163.com
afa_@163.com
awhaldc666@163.comax
q112dsdasdas@163.com
aaaa_____@qq.com
aaaa____@qq.com
'''
print(re.search('^[a-zA-Z][\w]{5,17}@163\.com$',emails,re.MULTILINE).group())

q112dsdasdas@163.com

需求6:匹配单词的边界

print(re.search(r'.*\bbeijing\b','I Love beijing too'))
print(re.search(r'.*\bbeijing\b','I Love beijing1 too'))

print(re.search(r'.*beijing','I Love beijing too'))

I Love beijing
None
I Love beijing

三、re模块的高级用法

re.findall(pattern,string)

1、findall:pattern在string里所有的非重复匹配,返回一个迭代器iterator保存了匹配对象

需求7:匹配所有符合以下条件的邮箱

163的邮箱地址,

邮箱的用户名包含6~18个字符,

可以是数字、字母、下划线、

但是必须以字母开头,

.com结尾

import re

emails='''
awhaldc@163.com
asdasdfddasdfascvdfgbdfgdsds@163.com
afa_@163.com
112dsdasdas@163.com
aaaa_____@126.com
aaaa____@163.com
'''

#findall:pattern在string里所有的非重复匹配,返回一个迭代器iterator保存了匹配对象
list=re.findall(r'(^[a-zA-Z][\w]{5,17}@(163|126).com$)',emails,re.MULTILINE)

print(list)
for email in list:
    print(email[0])

[(‘awhaldc@163.com’, ‘163’), (‘aaaa_____@126.com’, ‘126’), (‘aaaa____@163.com’, ‘163’)]
awhaldc@163.com
aaaa_____@126.com
aaaa____@163.com

2、sub:将匹配到的字符串,再次进行操作

需求8:匹配一个数字,把匹配的数字进行家1,返回

def add(result):    #result是一个匹配对象
    str_num=result.group()
    num=int(str_num)+1
    return str(num)


print(re.sub(r'\d+',add,'a=111'))

a=112

3、split:切割匹配成功的字符串

line='hello,world,china.'
print(re.split(r'\W+',line))

[‘hello’, ‘world’, ‘china’, ‘’]

需求9:以冒号或者空格,切割字符串

print(re.split(r':| ','info:kobe 18 beijing'))

[‘info’, ‘kobe’, ‘18’, ‘beijing’]

四、贪婪和非贪婪模式

什么是贪婪模式?
python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符
什么是非贪婪模式?
与贪婪模式相反,总是尝试匹配尽可能少的字符,可以使用、?、+、{m,n}加上?,使贪婪模式变为非贪婪模式*

需求9:非贪婪模式,需求:把电话和电话的描述信息尽可能的分开,只能用正则表达式

line2='this is my phone:188-1111-6666'
#非贪婪模式,需求:把电话和电话的描述信息尽可能的分开,只能用正则表达式
result=re.match(r'(.+?)(\d+-\d+-\d+)',line2)
print(result.group(1))
print(result.group(2))

this is my phone:
188-1111-6666

总结

到此这篇关于python正则表达式用法超详细讲解的文章就介绍到这了,更多相关python正则表达式用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Python实现子域名收集工具

    基于Python实现子域名收集工具

    在网络安全领域中,发现和管理攻击面绝对是一项必须的任务,而对域名的寻找和分析是发现攻击面的重要步骤,本文将使用Python编写一个子域名收集,需要的可以参考下
    2024-02-02
  • opencv基于Haar人脸检测和眼睛检测

    opencv基于Haar人脸检测和眼睛检测

    这篇文章主要为大家详细介绍了opencv基于Haar人脸检测和眼睛检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python排序搜索基本算法之插入排序实例分析

    Python排序搜索基本算法之插入排序实例分析

    这篇文章主要介绍了Python排序搜索基本算法之插入排序,结合实例形式分析了基于比较的插入排序和基于交换的插入排序实现技巧,需要的朋友可以参考下
    2017-12-12
  • 给Python中的MySQLdb模块添加超时功能的教程

    给Python中的MySQLdb模块添加超时功能的教程

    这篇文章主要介绍了给Python中的MySQLdb模块添加超时功能的教程,timeout功能在服务器的运维当中非常有用,需要的朋友可以参考下
    2015-05-05
  • Python3之字符串比较_重写cmp函数方式

    Python3之字符串比较_重写cmp函数方式

    这篇文章主要介绍了Python3之字符串比较_重写cmp函数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Python网络编程之网络与通信介绍

    Python网络编程之网络与通信介绍

    这篇文章主要介绍了Python网络编程之网络与通信介绍,计算机网络就是分布在不同的地区的计算机与专门的外部设备通信线路互联在一起,
    成为一个功能强,规模大的网络系统,本期就主要介绍网络与通信的相关知识和原理,需要的朋友可以参考下
    2023-08-08
  • Django admin美化插件suit使用示例

    Django admin美化插件suit使用示例

    这篇文章主要介绍了Django admin美化插件suit使用示例,简单介绍了suit的使用界面示例,官方文档,安装语句等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • pytorch中常用的损失函数用法说明

    pytorch中常用的损失函数用法说明

    这篇文章主要介绍了pytorch中常用的损失函数用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • 编写Python脚本来获取Google搜索结果的示例

    编写Python脚本来获取Google搜索结果的示例

    这篇文章主要介绍了编写Python脚本来获取Google搜索结果的示例,也是利用Python编写爬虫的一个简单实现,需要的朋友可以参考下
    2015-05-05
  • Windows上使用virtualenv搭建Python+Flask开发环境

    Windows上使用virtualenv搭建Python+Flask开发环境

    在自己本机的开发环境下,我们完全可以使用virtualenv来hold住多个Python环境,这样就可以留出一个专门服役于Flask框架,哈哈,这里我们就来看看如何在Windows系统上使用virtualenv搭建Python+Flask开发环境
    2016-06-06

最新评论