初学者python笔记(re模块、正则表达式完全解析)

2023-05-16

文章目录

    • 正则表达式与re模块
    • 字符匹配
        • 普通字符匹配
        • 利用元字符进行模糊匹配
          • 元字符: . ^ $ + ? {} [] | () \
          • 重复的字符匹配
    • re模块下的其他方法

今天总结一下正则表达式,它用来解决模糊匹配的问题,几乎在所有编程语言中都可以用,尤其在python爬虫中,它是一门必修知识;
所谓模糊匹配,就是在匹配字符串中,有一部分是确定的,另一部分是不确定的值但有范围的任意值;
这样我们就可以用一些具有特殊含义的符号,对字符串进行另一种描述,而这些特殊含义的符号就组成一个正则表达式。

正则表达式与re模块

正则表达式也内嵌在Python中,通过re模块来实现,常用方法是findall(),会将匹配到的字符串用一个列表返回
例如: 要匹配一大串字符串中的所有数字,不用for循环和If语句,用re模块一行就能实现

import re
print(re.findall('\d+',"sadfjk11ksk22iuir33bndb44uidu55sgsfir66o77"))

运行结果:
re模块

字符匹配

普通字符匹配

import re
print(re.findall('bigbig',"Iwannaabigbigjuicecanyougiveme?"))
#findall第一个参数是需要匹配的子串或子串规则,第二个参数为母串

运行结果:
普通字符匹配

利用元字符进行模糊匹配

元字符: . ^ $ + ? {} [] | () \
  1. .任意字符:
import re
#匹配b开头g结尾的子串,..表示任意的两个字符,如果不是两个,那就匹配不出来
print(re.findall('b..g',"abcdefgabcdghijklmn"))

运行结果:
.任意字符

  1. ^只能为开头:
import re
#匹配b开头g结尾的子串
#^表示子串的第一个字符只能在母串的开头,..表示任意的两个字符
print(re.findall('^b..g',"bbcgefgabcdghijblmg"))

运行结果:
^只能为开头

  1. $只能以结尾:
import re
#匹配b开头g结尾的子串
#$表示子串的最后一个字符只能在母串的结尾,..表示任意的两个字符
print(re.findall('b..g$',"abcdefgabcdghijblmg"))

运行结果:
只能以结尾

重复的字符匹配
  1. 贪婪匹配: 即尽量多地匹配,与之相反的是惰性匹配

  2. *是0到无穷个:

import re
#*表示子串的某个字符可以0到无穷次出现
print(re.findall('Wo23*Le',"sjfkufiWo233333333333333333333Le"))

运行结果:
0到无穷个

  1. +是1到无穷个:
import re
#+表示子串的某个字符可以1到无穷次出现(该元素至少出现一次),..表示任意的两个字符
print(re.findall('Wo23+Le',"sjfkufiWo233333333333333333333Le"))
#与*的区别匹配
print(re.findall('Wo23*',"dsjfkjfiWo2"))  #能匹配到内容
print(re.findall('Wo23+',"dsjfkjfiWo2"))  #不能匹配到内容,因为3要至少要出现一次

运行结果:
从1到无穷次

  1. ?匹配0次到1次:
import re
#匹配b开头g结尾的子串
#?表示子串的某个字符可以出现0到1次
print(re.findall('beii?',"abcdefghibeigggjklmn"))  #母串bei后面是g,不是i,所以不匹配bei后的i
print(re.findall('beig?',"abcdefghibeigggjklmn"))  #母串bei后有g,就匹配1次g

运行结果:
匹配0到1次

  1. {}任意规定次数:
import re
#{a,b}表示子串的某个字符可以出现a到b次,同时可表现*,+,?
#{0,}==*    {1,}==+     {0,1}==?
#匹配b开头g结尾的子串
print(re.findall('beig{6}',"abcdefghibeiggggggjklmn"))
#{n}没有规定范围,而只有一个参数时,表示严格执行重复n次,多了和少了都匹配不出来

运行结果:
匹配区间

  1. 在后加?变成惰性匹配
    以上四个都是贪婪匹配, + ? {}后面加一个?就可以变成惰性*匹配(尽可能少地匹配)
import re
print(re.findall('Wo23*',"sjfkufiWo233333333333333333333"))
print(re.findall('Wo23+',"sjfkufiWo233333333333333333333"))
print(re.findall('beig?',"abcdefghibeigggjklmn"))

#加?变惰性匹配,最终子串中的某个字都尽量少地匹配,匹配0次即不算进子串里面
print(re.findall('Wo23*?',"sjfkufiWo233333333333333333333"))  #匹配0次
print(re.findall('Wo23+?',"sjfkufiWo233333333333333333333"))  #匹配1次
print(re.findall('beig??',"abcdefghibeigggjklmn"))  #匹配0次

#但这样匹配加?后就没有效果了,因为末尾还有需要匹配的字符,所以不会变成懒惰
print(re.findall('Wo23*?Le',"sjfkufiWo233333333333333333333Le"))
print(re.findall('Wo23+?Le',"sjfkufiWo233333333333333333333Le"))

运行结果:
变惰性匹配

  1. []选择匹配:
import re
#[]表示选择[]中的一个字符进行匹配,可以当做‘或’来理解,只要母串有就可以匹配出来
print(re.findall('x[yz]',"iiooxyjiushixzxxoo"))  #匹配出xy或xz
print(re.findall('x[yz]p',"iiooxypjiushixzpxxoo"))  #匹配出xyp或xzp

#[]内的*,+等元字符都当做普通字符来匹配
print(re.findall('q[a*+?]',"iioojq*iusq+hiqaxxoo"))

#但是有3个特殊符号(-范围  ^非  \跟元字符去除特殊功能,\跟普通字符实现特殊功能),如匹配字符串中的字母
print(re.findall('q[a-z]','234988436qfsabcdefg386'))  #a-z表示a到z任意字母,但是[]内终究只会匹配一个字符
print(re.findall('q[a-z]*','234988436qfabcdefg386'))  #[a-z]*表示任意字母重复任意次,因为贪婪,所以会把后面的字母全部匹配进去
print(re.findall('q[0-9]*','ddsljq5201314skdjfinfkd'))  #匹配任意数字
print(re.findall('q[^0-9]',"jkddafkjq123jiuqb"))  #匹配非数字

运行结果:
选择匹配

  1. \转义字符:
    \跟元字符去除特殊功能,\跟普通字符实现特殊功能
import re
#\d匹配数字字符,\D匹配非数字字符
print(re.findall('q\d',"jkddafkjq123jiuqb"))  #匹配一个数字字符
print(re.findall('\d',"jkjk1jkj3kji1hgh4o52knngygy0pp"))  #匹配所有数字字符,包括不连续的不连接

#\s匹配任何空白字符(\t\n\r\f\v),\S匹配任何非空吧字符
print(re.findall('\S',"you are my girl"))

#\w匹配_、字母、数字字符,\W匹配非_、字母、数字字符
print(re.findall('\w',"s&u#n——_shine"))

#\\b匹配一个特殊字符边界,你需要的字符旁边有特殊字符
print(re.findall('I\\b',"may @I# am I from CHINA"))
#一个@I#中的I,一个单独的I和CHINA中的I,CHINA中的I周围没有特殊字符,所以不会匹配出来
print(re.findall(r'I\b',"may @I# am I from CHINA"))  #r和\b结合也有同样的效果
#其中r的意思是不让python做翻译,\b在python中和在正则中的意思不同,不翻译python这一层,
#就可以达到正则的效果。第一次执行的\\b也是利用\将\b变成在python中无意义,但在正则中有效

运行结果:
转义字符

  1. |或,()分组:
import re
#|左右两边都匹配
print(re.findall('qa|you',"jiushiqa|youiushi"))
#()将字符分组(特殊格式)
print(re.findall('(?P<name>[A-z]+)(?P<age>\d+)',"LuFei19Suolong22"))  #匹配一串字母+一串数字

#用search()来匹配,只会匹配遇到的第一个组
print(re.search('(?P<name>[A-z]+)(?P<age>\d+)',"LuFei19Suolong22"))
#用group()将分组好的元素取出来
print(re.search('(?P<name>[A-z]+)(?P<age>\d+)',"LuFei19Suolong22").group('age'))

#match方法与search几乎相同,也是只会匹配遇到的第一个子串
print(re.match('\d+',"1314520jiushi2333333"))
print(re.match('\d+',"1314520jiushi2333333").group())

运行结果:
或与分组

re模块下的其他方法

re模块下的方法,除了findall(),search()、match()还有以下几个常用的

  1. split()方法:分割字符串
import re
print(re.split('[ |]',"hello python|ok?"))  #将母串用空格和|分开
print(re.split('[mv]',"mtakemvab"))
#先匹配到m,将m前的空字符和后面的一串分开,得到''和'takemvab'
#又匹配到m,将m前的take分开,得到'take'和'vab'
#又匹配到v,将v前的''分开,得到''和'ab'

运行结果:
split()分割字符串

  1. sub()方法、subn()方法:替换字符串内容
import re
print(re.sub('\d+','Q',"take123away4567it"))  #将所有连续的数字替换成一个Q
print(re.sub('\d','Q',"take123away4567it"))  #将所有数字替换成Q
print(re.sub('\d','Q',"take123away4567it",4))  #将前四个数字替换成Q
print(re.subn('\d','Q',"take123away4567it"))  #替换后会返回替换的个数

运行结果:
sub()替换方法

  1. compile():自定义匹配规则
import re
dig = re.compile('\d+')  #设计一个匹配连续数字的规则,并将规则命名为dig
print(dig.findall("love18874her15157"))  #匹配时就可直接调用规则

运行结果:
自定义匹配规则

  1. finditer():匹配后转换成迭代器
import re
ret = re.finditer('\d+',"love18874her15157Ok88")  #匹配结果是一个迭代器组成的组
print(next(ret).group())  #用next来遍历,用分组取出
print(next(ret).group())
print(next(ret).group())

运行结果:
dinditer()匹配后转成迭代器

  1. ()内的?:表示去优先级:
import re
print(re.findall('www\.(?:baidu|sina)\.com',"www.sina.com"))  #()分组会默认将分组拿出
print(re.findall('(abc)+',"xyzabcabcabcxyzxy"))  #()内默认只会匹配一个组的内容
print(re.findall('(?:abc)+',"xyzabcabcabcxyzxy"))  #其中?:去除优先级,则会匹配多个组的内容
print(re.findall('(abc)',"xyzabcabcabcxyzxy"))  #但可以匹配多个组(有严格分组),不管是否有优先级
print(re.findall('(?:abc)',"xyzabcabcabcxyzxy"))

运行结果:
?:去优先级

到此为止,本篇文章已经总结完了正则表达式与Pythonre模块中的大部分用法。很多细节部分也都有所举例,所以内容比较多,希望读者能慢慢消化。或许你会觉得正则表达式有些太繁琐,但是,当你学到爬虫阶段的时候,就知道正则表达式是多么好用。而且,作为一个程序员,会正则是一项基本技能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初学者python笔记(re模块、正则表达式完全解析) 的相关文章

  • matlab 点云滤波(中值、均值、高斯滤波)代码

    点云中值 均值 高斯滤波 介绍一下滤波函数 smoothdata 对含噪数据进行平滑处理 B 61 smoothdata method 为上述任一语法指定平滑处理方法 例如 xff0c B 61 smoothdata A 39 sgolay
  • 时间复杂度

    1 时间复杂度 在进行算法分析时 xff0c 语句总的执行次数T n xff09 是关于问题规模n的函数 xff0c 然后分析T n xff09 随n的变化 这样用大写的O来标记算法的时间复杂度 xff0c 称之为大O Order的简写 x
  • 解决电脑80端口被占用问题!亲测有用!!!

    方法1 xff1a 1 在桌面 xff0c 按下 WINDOW 43 R 快捷键 2 在弹出的命令行窗口下执行下面的命令 xff1a cmd xff0c 点击确定 3 输入net stop http xff0c 点击确定 xff0c 再次输
  • linux 下 常见 知识点

    1 etc resolv conf ping通baidu com DNS 域名解析服务器 xff01 该文件是DNS域名解析的配置文件 xff0c 它的格式很简单 xff0c 每行以一个关键字开头 xff0c 后接配置参数 resolv c
  • 学习51单片机经历

    学习51单片机的记录 文章目录 前言一 所使用的软硬件设备二 学习课程三 学习内容1 软件安装2 单片机基础3 真正开始学习 xff08 一 xff09 LED灯 总结修改日志 前言 提示 xff1a 只是记载本人学习51单片机的经历 xf
  • LED灯系列

    LED灯系列 本系列为stc89c52RC单片机开发板上LED灯相关操作思路和代码 点此链接转到专栏目录链接 http t csdn cn skf2j 文章目录 LED灯系列1 xff09 原理2 xff09 单个LED灯常亮3 xff09
  • Angular CLI的安装报错

    一 安装步骤 angular cli它是angular框架官方的一个构建工具 xff0c 当你使用 ng new xxx 项目名 创建一个项目时 xff0c 会自动生成项目结构 Angular CLI用于简单 xff0c 快速构建Angul
  • 最新Anaconda3的安装配置及使用教程

    安装记录参考链接 出现问题 xff1a 镜像地址无效 不知道 设置Anaconda镜像 那一步我哪里没有操作好 答 步骤错了 正确步骤 xff1a 1 先执行 conda config set show channel urls yes 生
  • Linux 环境变量:DISPLAY

    1 dbvis no x11 display variable was set but this program performed an operation which requires it solution export DISPLA
  • PostgreSQL入门-安装与基本使用(Ubuntu)

    PostgreSQL入门 安装与基本使用 xff08 Ubuntu xff09 PostgreSQL 是一个免费的对象 关系数据库服务器 ORDBMS xff0c 号称是 世界上最先进的开源关系型数据库 PostgreSQL 是以加州大学计
  • windows下的pycharm项目部署同步到Linux下的pycharm开发

    windows下的pycharm项目部署同步到Linux下的pycharm开发 一 运行平台二 SSH连接远程服务器 一 运行平台 项目部署系统 xff1a UOS 项目开发平台 xff1a windows10 IDE xff1a PyCh
  • redhat操作系统升级红帽6升级到红帽7linux升级

    本文档介绍了从 RHEL 6 到 RHEL 7 就地升级的步骤 支持的就地升级路径是从 RHEL 6 10 到 RHEL 7 9 如果您的 RHEL 系统满足以下条件 xff0c 则完全支持此 RHEL 6 到 RHEL 7 升级过程 xf
  • Kubernetes角色访问控制RBAC和权限规则(Role+ClusterRole)---好文

    基于角色的访问控制 xff08 Role Based Access Control 即 RBAC xff09 使用 rbac authorization k8s io API Group实现授权决策 xff0c 允许管理员通过Kuberne
  • 你知道abrt-hook-ccpp吗

    1 什么是abrt hook ccpp abrt也可以叫abrtd xff0c 展开应该是automatically bug report daemon xff0c 也就是自动错误报告守护进程 从字面意义就可以看出 xff0c 他是一个守护
  • Mobaxterm 使用图形界面

    redhat 7 yum install firefox xorg x11 xauth mesa libGLES devel x86 64 mesa dri drivers vi etc ssh sshd config X11Forward
  • Linux ❉ Chronyd时间同步服务器详解

    一 介绍 1 简介 集群中节点之间需要时间同步 xff0c Chronyd不依赖外部的时间服务NTP xff0c 在内部搭建时间服务器 Chrony是网络时间协议 xff08 NTP xff09 的一种实现 xff0c 是一个类Unix系统
  • Linux时间延迟平滑对时方案的分析-Ntp和Chrony的不同表现

    系列文章目录 文章目录 系列文章目录前言一 环境信息二 ntpd模式 2 1 版本信息2 2 配置ntpd对时源 2 2 1 配置ntpd服务配置 xff0c 启动ntpd服务2 3 2 查看对时情况2 3 配置ntpd客户端 2 3 1
  • keepalive实现MGR的自动切换(二)

    10 0 0 7 lemon 10 0 0 8 lemon2 10 0 0 9 lemon3 程序代码里只需写一个VIP连接数据库即可 xff0c 后面是连接在哪一台通过 xff0c keepalived的在服务端实现 xff1b 通过检测
  • mysql MGR配置keepalived

    之前写过一篇mysql8 0搭建MGR 在这里 mysql8 0配置MGR 悠游 博客园 cnblogs com 在此基础上配置keepalived 一 安装keepalived 可能会少些包 xff0c 所以配置了网络yum源 所有节点均
  • UltraVNC 使用方法详细说明

    每次修改uvnc settings exe后 xff0c 都要重启Winvnc或者VNC server的进程 配置 否则会如下图 结束Winvnc进程 重新打开winvnc exe 直接点OK 打开UVNC Launch exe 右键SER

随机推荐