python之正则表达式

目录

正则表达式

python正则表达式方法

match

search

findall

finditer

compile

元字符匹配

元字符

量词

贪婪匹配和惰性匹配

正则表达式的group

语法

案例

正则表达式

  • 正则表达式又称规则表达式,是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式的文本
  • 正则表达式就是使用元字符进行排列组合用来匹配字符串,并通过规则去验证字符串是否匹配
  • python正则表达式,使用re模块,并基于re模块的三个基础方法来做正则匹配(match、search、findall)

python正则表达式方法

**使用时先导入re模块:**import re

match

**语法:**变量=re.match(匹配规则,被匹配的字符串)

**注意:**从被匹配的开头进行匹配,匹配成功则返回匹配对象,匹配不成功则返回None

**取得下标:**变量.span()

**取得匹配字符串:**变量.group()

python 复制代码
#导入re模块
import re
s="python language"
result=re.match("python",s)
print(result)#<re.Match object; span=(0, 6), match='python'>
print(result.span())#匹配的下标
print(result.group())#匹配的字符串

**语法:**变量=re.search(匹配规则,被匹配的字符串)

**作用:**搜索整个字符串,找出匹配的,从前向后,找到第一个后就停止不会继续向后,整个字符串都找不到,就返回None

**取得下标:**变量.span()

**取得匹配字符串:**变量.group()

python 复制代码
#导入re模块
import re
s="i like python very much python yyds"
result=re.search("python",s)
print(result)#<re.Match object; span=(7, 13), match='python'>
print(result.span())
print(result.group())

findall

**语法:**列表对象=re.findall(匹配规则,被匹配的字符串)

**作用:**匹配整个字符串,找出全部匹配项,找不到则返回list:[]

python 复制代码
#导入re模块
import re
s="i like python very much python yyds"
result=re.findall("python",s)
print(result)#['python', 'python']

finditer

**语法:**列表对象=re.findall(匹配规则,被匹配的字符串)

**作用:**匹配字符串中的所有内容,返回的是迭代器。

python 复制代码
import re
result=re.finditer(r"\d+","我的电话号码是10086,女朋友电话号码是10010")
print(result)#<callable_iterator object at 0x0000029E66A093C0>
for i in result:
    print(i.group())
# 10086
# 10010

注意:

  • 字符串r标记表示当前字符串是原始字符串,即内部的转义字符无效而是普通字符
  • 从迭代器中拿到内容需要i.group()

compile

**前言:**正则表达式可能会被写的很长,此时复杂的正则可能有需要反复的使用,此时就可以把该正则提前加载好,后面用的时候直接拿来用就能够提高一点点效率

**语法:**预加载正则表达式=re.compile(r"需要编译的正则表达式")

python 复制代码
import re
#预加载正则表达式
obj=re.compile(r"\d+")#很复杂的正则表达式
result=obj.findall("我的电话号码是10086,女朋友电话号码是10010")
print(result)#['10086', '10010']

元字符匹配

元字符

**含义:**具有固定含义的特殊符号

|--------------|-------------------------|
| 字符 | 功能 |
| .(点) | 匹配任意一个字符(除了\n),\.匹配自身 |
| [] | 匹配[]中列举任意一个字符 |
| [^......] | 匹配除了字符组中的所有字符 |
| \d | 匹配数字,即0-9 |
| \D | 匹配非数字 |
| \s | 匹配空白,即空格、tab键 |
| \S | 匹配非空白 |
| \w | 匹配大小写英文字母数字及下划线(单词字符) |
| \W | 匹配非单词字符 |
| \n | 匹配一个换行符 |
| \t | 匹配一个制表符 |
| ^ | 匹配字符串开头 |
| $ | 匹配字符串结尾 |
| | | 匹配左右任意1个表达式 |
| () | 匹配括号里的内容 |

**注意:**元字符仅能匹配单个字符

量词

**含义:**控制前面元字符出现的次数

|--------|---------------------|
| 量词 | 功能 |
| * | 匹配前一个规则字符重复出现了0到无数次 |
| + | 匹配前一个规则字符重复出现了1到无数次 |
| ? | 匹配前一个规则字符重复出现了0或1次 |
| {m} | 匹配前一个规则字符重复出现了m次 |
| {m,} | 匹配前一个规则字符重复出现了m到无数次 |
| {m,n} | 匹配前一个规则字符重复出现了m到n次 |

贪婪匹配和惰性匹配

|------------|-----------|
| 匹配方式 | 功能 |
| .*(贪婪匹配) | 尽可能多的匹配字符 |
| .*?(惰性匹配) | 尽可能少的匹配字符 |

**举例:**玩吃鸡游戏,晚上一起上游戏,干嘛呢?打游戏啊

  • **玩.*游戏:**玩吃鸡游戏,晚上一起上游戏,干嘛呢?打游戏
  • 玩.*?游戏: 玩吃鸡游戏

正则表达式的group

语法

给匹配到的分组正则命名:(?P<名字>正则表达式)

**获取对应分组匹配的内容:**match对象.group("名字")

案例

python 复制代码
import re
s="""
    <div class='a'><span id='1'>周杰伦</span></dir>
    <div class='b'><span id='2'>郭麒麟</span></dir>
    <div class='c'><span id='3'>周星驰</span></dir>
    <div class='d'><span id='4'>刘德华</span></dir>
"""
obj=re.compile(r"<div class='(?P<ch>.*?)'><span id='(?P<num>\d+)'>(?P<name>.*?)</span></dir>",re.S)
#注意这里的re.S代表让.也可以匹配换行符
result=obj.finditer(s)
for i in result:
    print(i.group("name"))# 周杰伦 郭麒麟 周星驰 刘德华
相关推荐
Python私教21 分钟前
PyPika:Python SQL 查询构建器
开发语言·python·sql
卡戎-caryon1 小时前
【MySQL】01.MySQL环境安装
数据库·笔记·mysql·环境配置
AI研习星球2 小时前
数据分析-50-客户价值分析-用Python实现RFM模型
python·机器学习·自然语言处理·数据挖掘·数据分析·算法学习·论文辅导
机器懒得学习2 小时前
打造智能化恶意软件检测桌面系统:从数据分析到一键报告生成
人工智能·python·算法·数据挖掘
tony3652 小时前
optuna和 lightgbm
pytorch·python·深度学习
测试老哥3 小时前
功能测试和接口测试
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·接口测试
我走过的路你也许在走3 小时前
python装饰器学习案例
开发语言·python·学习
我的运维人生3 小时前
Python在数据处理与分析中的高效应用:以金融数据为例
开发语言·python·金融·运维开发·技术共享
慧都小妮子4 小时前
借助Aspose.html控件, 使用 Java 编程将 HTML 转换为 BMP
java·python·html·aspose
m0_748256144 小时前
【全栈开发】----用pymysql库连接MySQL,批量存入
android·数据库·mysql