轻松了解python正则表达式 (超详细,附举例)

在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块来操作,名字为re
import re

(1)三种基本方法

在re模块中,通常使用三种方法,match,search和findall,下面对这三种方法进行简单的介绍:

一.match方法

re.match 尝试从字符串的起始位置匹配一个模式,匹配成功则返回的是一个匹配对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的是空,
注意:match只能匹配到一个**

下面来看代码理解

s = 'python123python666python888'result = re.match('python', s)
print(result)  # <re.Match object; span=(0, 6), match='python'>
print(result.span())  # (0, 6)
print(result.group())  # python

1.通过span()提取匹配到的字符下标
2.通过group()提取匹配到的内容
而s字符串中有3个python的存在,match只能匹配到一个

下面我们改变一下s,得到不一样的结果

s = '1python123python666python888'result = re.match('python', s)
print(result)  #None

因为match从字符串的起始位置开始匹配,这里起始的第一个字符为1,所以匹配失败返回None.
那么我们要如何才能匹配到字符串中间我们想要的部分呢,这个时候就用到了search函数

二.search方法

re.search 扫描整个字符串,匹配成功则返回的是一个匹配对象(这个对象包含了我们匹配的信息)
注意:search也只能匹配到一个,找到符合规则的就返回,不会一直往后找
同样的,search也只能匹配到一个.
代码如下

s = '1python123python666python888'result = re.search('python', s)
print(result)  # <re.Match object; span=(1, 7), match='python'>
print(result.span())  # (1, 7)
print(result.group())  # python

当然,若是都找不到则返回None值

s = '1python123python666python888'result = re.search('python98', s)
print(result)  # None

*search方法虽然解决了match的从头匹配的弊端,但它也只能匹配到一个,这个时候我们就可以使用findall方法了 *

三.findall方法:

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表

s = '1python123python666python888'result = re.findall('python', s)
print(result)  # ['python', 'python', 'python']

上面的三种方法看上去只能匹配到简单的字符串,也许我们觉得用一般的方法也可以办到:
比如字符串的index方法(也可以用循序)

print(s.index('python'))  # 1
print(s.index('python', 2))  # 10
print(s.index('python', 11))  # 19

那么正则表达式应该用在什么地方呢:

  • 判断用户注册帐号是否满足格式
  • 抓取页面中特定部分数据
  • 判断用户提交的邮箱的格式是否正确 等等等等
    那么我们就要了解元字符

(2).元字符

元字符:本身具有特殊含义的字符
先看几张常用的图片

单字符匹配: 如下

代表数量的元字符

表示边界的元字符

分组匹配

(in2)举例

下面我们来举一些例子

1.匹配账号:只能由字母和数字组成,长度为10位
import res = '1587022xzq'result = re.match('[0-9a-zA-z]{10}', s)
print(result)  # <re.Match object; span=(0, 10), match='1587022xzq'>

因为账号是从头到尾的,只需要匹配一次就行,所以我们可以使用match方法,但是上面的代码明显存在问题,比如将长度增加三位,它将依然能匹配到

s = '1587022xzqty'result = re.match('[0-9a-zA-z]{10}', s)
print(result)  # <re.Match object; span=(0, 10), match='1587022xzq'>

这是因为我们没有加上控制边界的元字符,下面是修改后正确的代码

s = '1587022xzqty'
result = re.match('^[0-9a-zA-z]{10}$', s)
print(result)  # None

解析:

  • (因为对于match来说,从头开始匹配,所以这里的^可以不加)
  • $的意思是匹配到字符串的结尾,
  • 账号的长度为10位是通过代表数量的元字符{10}来控制的
2.匹配qq号:长度为5-11位,纯数字组成,第一位不为0
s = '10086111222'
# 5 - 11 位
result = re.match('[1-9][0-9]{4,10}$', s)
print(result)  # <re.Match object; span=(0, 11), match='10086111222'>

解析:

  • 这里的代表数量的元字符{4,10}表示[0-9]出现的次数为[4,9]次(大于等于4,小于等于9),而第一位[0-9]占了一位数字,所以加起来是5-11位符合要求的qq号

我们可以简化一下[0-9]的写法,\d就可以代表纯数字

s = '10086111222'
# 5 - 11 位
result = re.match(r'[1-9]\d{4,10}$', s)
print(result)  # <re.Match object; span=(0, 11), match='10086111222'>

tip:这里在字符串前面加上r是为了取消转义,不然就需要写成 \d(虽然这里的\d实际上没有影响)

3.检索文件名 格式为 xxx.py
s = '1.py 2.png ssx.csv qaq.txt xzq.py'
#文件名格式:  (数字字母_).py
result = re.findall(r'\w+\.py\b', s)
print(result)   # ['1.py', 'xzq.py']

解析:

  • \w代表 word ,及字母数字或下划线
  • +为控制数量 >=1
  • \b代表边界,这里如果前面不加上r的话\b就应该写成\b
  • 注意点.文件的格式为xxx.py 这里的.需要特别注意,因为在单字符匹配中

    所以我们需要使用 \ . 来表示我们所需要的.
4.匹配1-100的数字
s = '89'result = re.match(r'[1-9]?\d?$', s)
print(result)   # <re.Match object; span=(0, 2), match='89'>

这是第一步的思路,但是当我们把s改为100时就发现了错误

s = '100'result = re.match(r'[1-9]?\d?$', s)
print(result)  # None

改进之后的代码

s = '100'
r = '98'
z = '9'
q = '0'
result = re.match(r'[1-9]?\d?$|100$', s)
print(result)
print(re.match(r'[1-9]?\d?$|100$', r))
print(re.match(r'[1-9]?\d?$|100$', z))
print(re.match(r'[1-9]?\d?$|100$', q))
'''
<re.Match object; span=(0, 3), match='100'>
<re.Match object; span=(0, 2), match='98'>
<re.Match object; span=(0, 1), match='9'>
<re.Match object; span=(0, 1), match='0'>
'''
5.验证输入的邮箱
# 验证输入的邮箱 163 126 qq 前面至少五位,至多11位
email = '738473800@qq.com'
result = re.match(r'\w{5,11}@(163|126|qq)\.(com|cn)$', email)
print(result)  # <re.Match object; span=(0, 16), match='738473800@qq.com'>

注意:括号和方括号的区别
(qq|163|126)代表的是qq或163或126
[qq|163|126]代表的是q1236这几个符号

6.分组提取匹配爬虫电话号码

比如我们用爬虫爬到了一组数据
里面有一组数据是xxxx-xxxxxxxx
前面包含3/4个数字,后面包含8个数字
下面将他们取出,这里我们用到了分组,(小括号)

# 爬虫
phone = '010-12345678'
result = re.match(r'(\d{3}|\d{4})-(\d{8})$', phone)
print(result)  # <re.Match object; span=(0, 12), match='010-12345678'>
print(result.group())  # 010-12345678
print(result.group(1))  # 010
print(result.group(2))  # 12345678

一个小括号为一个分组,可以用group提取出来

7.匹配html标签内容
# 爬虫
html标签的格式形如 <xxx>y</xxx>    y为我们要提取的内容
s = '<h1>hello</h1>'
result = re.match('<[0-9A-z]+>(.+)</[0-9A-z]+>$', s)
print(result)  # <re.Match object; span=(0, 14), match='<h1>hello</h1>'>
print(result.group(1))  # hello

表面上看这样没什么问题,但如果更改s如下就出现了问题

# 爬虫
s = '<html>hello</h1>'
result = re.match('<[0-9A-z]+>(.+)</[0-9A-z]+>$', s)
print(result)  # <re.Match object; span=(0, 16), match='<html>hello</h1>'>
print(result.group(1))  # hello

所以改进,利用分组来判断

# 爬虫
s = '<html>hello</h1>'
s2 = '<html>hello</html>'
result = re.match(r'<([0-9A-z]+)>(.+)</\1>$', s)
print(result)  # None
result = re.match(r'<([0-9A-z]+)>(.+)</\1>$', s2)
print(result)  # <re.Match object; span=(0, 18), match='<html>hello</html>'>
print(result.group(1))  # html
print(result.group(2))  # hello

解析:这里使用\1代表与第一个分组相同
拓展:起名字

# 取名字 (?P<名字>正则) (?P=名字)

看似繁琐了一点,但是在遇到复杂的情况,比如多重标签嵌套,或者其他情况下的时候通过取名分组的方法十分实用,不容易出错

# 取名字 (?P<名字>正则) (?P=名字)
s = '<html>hello</h1>'
s2 = '<html>hello</html>'
result = re.match(r'<(?P<name1>\w+)>(.+)</(?P=name1)>$', s)
print(result)  # None
result = re.match(r'<(?P<name1>\w+)>(?P<msg>.+)</(?P=name1)>$', s2)
print(result)  # <re.Match object; span=(0, 18), match='<html>hello</html>'>
print(result.group('name1'))  # html
print(result.group('msg'))  # hello

(3).sub方法

类似于replace替换方法rre.sub(正则表达式,替换成什么,要替换的字符串)

s1 = 'java:90 python:95 html:89'
result = re.sub(r'\d+', '90', s1)
print(result)  # java:90 python:90 html:90

不过第二个参数位置可以放函数
比如把取出来的数字都加一,函数可以理解为找到一个匹配的值就执行一次函数

def func(num):a = num.group()b = int(a) + 1return str(b)s1 = 'java:90 python:95 html:89'
result = re.sub(r'\d+', func, s1)
print(result)  # java:91 python:96 html:90

(4).split方法

split切割,根字符串的spilt类似,但是更加灵活

s1 = 'java:90,python:95,html:89'
result = re.split(r'[,:]', s1)
print(result)  # ['java', '90', 'python', '95', 'html', '89']

(5).贪婪与非贪婪

正则默认都是用贪婪模式去匹配数据的,就是尽可能多的匹配符合要求的数据
非贪婪模式下,始终找最短匹配

加上?之后就变成非贪婪模式

s1 = 'abc1123avc'
result = re.findall(r'[A-z]+\d+', s1)
print(result)  # ['abc1123']
s1 = 'abc1123avc'
result = re.findall(r'[A-z]+\d+?', s1)
print(result)  # ['abc1']

轻松了解python正则表达式 (超详细,附举例)相关推荐

  1. python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——增删改查篇

    python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)--增删改查篇 前言 一.主界面的样式 二.学生信息的增,删,改,查 1.增加学生信息 2.删除学生信息 3.更改学 ...

  2. Java Web实现登录注册(超详细附代码)

    Java Web实现登录注册(超详细附代码) 文章目录 Java Web实现登录注册(超详细附代码) 1.前言 2.登录注册设计流程 3.注册的数据流程 4.登录的数据流程 5.部分代码的展示 5.1 ...

  3. 数据挖掘领域十大经典算法之—SVM算法(超详细附代码)

    相关文章: 数据挖掘领域十大经典算法之-C4.5算法(超详细附代码) 数据挖掘领域十大经典算法之-K-Means算法(超详细附代码) 数据挖掘领域十大经典算法之-Apriori算法 数据挖掘领域十大经 ...

  4. 数据挖掘领域十大经典算法之—AdaBoost算法(超详细附代码)

    相关文章: 数据挖掘领域十大经典算法之-C4.5算法(超详细附代码) 数据挖掘领域十大经典算法之-K-Means算法(超详细附代码) 数据挖掘领域十大经典算法之-SVM算法(超详细附代码) 数据挖掘领 ...

  5. 单链表的增、删、查、改、python实现,超详细讲解

    单链表的python实现 代码增.删.查.改.及超详细注释: class Node(object):"""链表单节点实现"""def __i ...

  6. python爬百度翻译-爬虫 python爬取百度翻译接口 超详细附源码

    前言 今天教大家如何利用 firefox 分析百度翻译的接口,并用python爬取接口.大家学会后可以干一些有趣的事情,比如做一个自己的翻译软件. 具体内容 1 - 找到URL接口 进入百度翻译的网址 ...

  7. 【Python自然语言处理】使用逻辑回归(logistic)对电影评论情感分析实战(超详细 附源码)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一.舆情分析 舆情分析很多情况下涉及到用户的情感分析,或者亦称为观点挖掘,是指用自然语言处理技术.文本挖掘以及计算机语言学等方法来正确识别和提取文 ...

  8. Python启发式算法中爬山法的讲解及解方程问题实战(超详细 附源码)

    一.启发式算法 还有一类重要的迭代法,它的迭代关系式不依赖问题的数学性能,而是受某种自然现象的启发而得到,称为启发式算法(Heuristic Algorithm),如爬山法.遗传算法.模拟退火算法.蚁 ...

  9. 【Python+百度API】实现人脸识别和颜值检测系统(包括人脸数量、年龄、颜值评分、性别、种族、表情检测)(超详细 附源码)

    需要源码请点赞关注收藏后评论区留下QQ~~~ 本系统根据已有的模型上改写,添加了在给照片打分的同时可以显示照片,这样显得更加直观和真实 一.百度API文档 如需要请自行前往官网查询文档相关内容 百度A ...

  10. Perl正则表达式超详细教程

    前言 想必学习perl的人,对基础正则表达式都已经熟悉,所以学习perl正则会很轻松.这里我不打算解释基础正则的内容,而是直接介绍基础正则中不具备的但perl支持的功能.关于基础正则表达式的内容,可参 ...

最新文章

  1. php拷贝mysql表_MySQL复制表数据或表结构到新表中
  2. LeakDiag 微软一款检测memory leak的工具
  3. codeforces 498 div3(a-e java)
  4. LinkedList ArrayList Vector的区别
  5. Java学习需要掌握哪些技能?
  6. 下列哪项属于正确的锁定计算机桌面,【2018年职称计算机考试WindowsXp练习题及答案1】- 环球网校...
  7. web页面找不到资源文件,报404,但是资源文件存在且路径没错
  8. Nancy 框架学习
  9. 麻省理工线性代数03
  10. 苹果Mac文件自动化整理工具:Hazel
  11. 把路由器配置成DHCP服务器,并确保路由功能。
  12. PPT插入Excel图标,如果水平翻转做出漂亮逻辑图表?
  13. python numpy的shape函数
  14. oracle数据库查询904错误,EXP-00008:遇到ORACLE错误904问题详解
  15. UWA DAY 2021 精彩盘点 | 35场技术议题掀起的思维浪潮
  16. mysql is marked_快速解决MySQL:Table xxx is marked as crashed and should be repaired五个办法...
  17. python加减乘除求余
  18. ArcGIS API for JavaScript 图层顺序
  19. redis 在java中的实例使用场景
  20. 从事人工智能行业,推荐的几本书籍

热门文章

  1. C语言程序员个人简历范文,程序员求职放大招!牛人用C语言写简历
  2. 学校计算机硬件管理制度,学校规章制度之计算机硬件管理制度
  3. matlab求两向量夹角_MATLAB概率和统计(2)
  4. Docker 容器化开发(八)设置tomcat nginx 和 mysql redis 容器间互联
  5. 企业私有云存储选NAS还是私有云盘?3分钟带你了解企业NAS和企业云盘的区别
  6. 推荐歌曲《 起风了》
  7. Verilog时钟n分频
  8. 在线latex 网址
  9. 装了冰点还原如何修改计算机ip,冰点还原软件如何使用
  10. wav音乐里面竟然有病毒?