正则表达式
处理字符串的利器
- 选用:
- 想查看原字符串是否匹配 ->match,fullmatch,search
- 想从大字符串中提取指定的子字符串 ——> findall,finditer
- 格式:函数(正则表达式,字符串)
- 核心:正则表达式整体就是一个具有某一特定规则的字符串,主要是要将想要拿的数据的特定规则写出来
- 切割和替换:split,sub
一、匹配
匹配核心规则:判断后面的字符,是否符合正则表达式描述的规则,符合返回:匹配的字符,不符合返回:None
1. 正则表达式语法
1. 匹配类符号
以下都是针对一个字符的格式判断
- 普通符号: – 在正则表达式中表示本身的符号
- str1 = ‘abc’
- result = fullmatch(r’abc’,str1)
- 除了特殊符号,就是普通字符
- . : – 表示匹配任意一个字符
- result = fullmatch(r’a.c’,str1)
- 任意字符,注重要求长度或占位情况
- \d : – 匹配任意一个数字字符
- result = fullmatch(r’a\dc’,‘123’)
- \s : – 匹配任意一个空白字符:例如:空格、换行、水平制表符
- \D : – 匹配任意一个非数字字符
- \S : – 匹配任意一个非空白字符
- \w : – 匹配字母数字下划线,等价于[a-zA-Z0-9_]
- \W : – 匹配非数字字母下划线的字符
- [字符集]: – 匹配字符集中的任意一个字符(最常用)
- 规范:可以连在一起写,合并为一个区间,判断该一个字符在不在这个区间
- 写多个其中一个,eg:[abc],字符集中不用写引号
- 有特殊字符,eg:[abc\d],匹配任意一个数字或者a/b/c
- 区间,小的放前面,大小按照编码值来确定eg:[1-9],[3-9],[a-z],[A-Z],[\u4e00-\u9fa5],[1-9abcA-Z],[1-9a-zA-Z]
- 如果减号两边没有字符,那就是普通字符‘-’
- '-'号只有在[]里的,且在两个字符中间的时候,有特殊功能表示区间
- [^字符集]: – 不在字符集中的任意一个字符
- result = fullmatch(r’a[^\u4e00-\u9fa5]b’,‘asb’)
2. 匹配次数符号:
统一格式为:匹配符号匹配次数符号.跟在谁后面,就是控制谁
-
- :0次或多次,任意次数。eg:result = fullmatch(r’a*bc’,‘aaaaabc’)
-
- ? :1次或0次。
- {} : – 最常用
- {M,N} - M到N次
- {M,} - 至少M次
- {,N} - 最多N次
- {N} - 就是N次
3. 贪婪和非贪婪 - 当匹配次数不确定时(*、+、?、{M,N},{M,}、{,N}),匹配模式分为贪婪模式和非贪婪模式两种,默认是贪婪的。
- 贪婪:如果匹配成功的时候,有多种匹配结果,贪婪取最多次数对应的匹配结果
- 非贪婪:如果匹配成功的时候,有多种匹配结果,贪婪取最多次数对应的匹配结果
- 正常匹配次数后面加一个‘?’
- *?、+?、??、{M,N}?、{M,}?、{,N}?
- 注意:
- 要求:必须有多种匹配返回的结果
- 举例:fullmatch只有一个结果(原字符串/空),无贪婪情况。match是从原字符串中截取开头,返回开头字符串,可能会有多种开头字符的情况
4.分组和分支
-
分组 - ()、捕获是针对于()来说的
- 分组功能:
- 表达式重复:将正则中的一部分看成一个整体,进行相关操作。
- ‘12MN23MN34KJ…’
- result = fullmatch(r’(\d\d[A-Z]{2})+',str1)
- 对一个括号整体结构,进行匹配次数操作
- 要求某块字符和之前的部分字符的一样:可以在正则表达式中通过\N(\任意正整数)来重复它前面第N个分组的匹配结果(从左边开始数)
- str2 = ‘23MKJ==MKJ23’
- result = fullmatch(r’(\d{2})([A-Z]{3})==\2\1’,str2)
- 只能重复在它之前的分组,不能重复之后的
- 捕获: 只获取正则表达式中的分组匹配到的结果
- 手动捕获:()里输入组数
- 自动捕获: 当findall正则表达式中加入(),先匹配出结果,然后返回匹配结果()中的内容
-
分支 - |
- 语法:正则1|正则2|正则3|…
- 功能: 匹配可以和多个正则中任意一个正则匹配的字符串
- 理解:
- |分开的是两个正则
- ()中加|,是对组内分支。所以如果只想要一部分变化,那就用(部分正则1|部分正则2)
- 举例:result=fullmatch(r’\d{3}|[a-z]{2}',‘mk’) -->
5.转义字符
- 正则表达式中有许多有特殊含义的字符,当需要让其表示本身时,前面加一个\进行转义即可
- 正则表达式前面的r是为了让正则规则生效,不是原始字符串
- 单独存在,有特殊意义的符号,在[]中特殊意义会自动失效
6. 检测类符号 – 在匹配成功的情况下,检测检测符号所在的位置是否符合要求
- \b:检测是否是单词边界
- 单词边界:可以将两个单词分开的符号都是单词边界,比如:空白符号、英文标点符号、字符串开头、字符串结尾
- 不影响原正则,只是在其上对成功返回的匹配结果,进行进一步筛选。\b
- \B:
- ^ :检测是否是字符串开头
- 预防贪婪,只取前面多少个
- findall(r’^.{10}')
- $ :检测是否以字符串结尾
- 预防贪婪,只取前面多少个
- findall(r’.{5}$')
2. 功能函数
- python中的re模块: - python用来支持正则表达式的模块,包含了所有和正则相关的函数方法
- from re import * (想用哪个自己加)
-
fullmatch(正则表达式,字符串) – 完全匹配;全部字符,挨个对照格式,返回是否匹配
- 功能: 判断正则表达式和指定的一个字符串是否完全匹配
- 返回值:匹配成功,返回匹配对象,匹配失败,为None
-
match(正则表达式,字符串)
- 功能:判断字符串开头,的若干个字符是否符合正则表达式描述的规则。
- 返回值:匹配成功,返回匹配对象(开头子串),匹配失败,为None
-
search(正则表达式,字符串)
- 功能:获取字符串中第一个满足正则的子串
- 返回值:找的到,返回该子串;找不到返回None
-
findall(正则表达式,字符串)
- 功能:返回列表,所有满足正则的子串,加进列表里
- 返回值:成功,返回一个列表,列表中包含所有满足条件的子串,找不到返回空列表
- 特殊:会有自动捕获:一旦正则中出现(),就只输出()中的内容
-
finditer(正则表达式,字符串)
- 功能:同findall
- 返回值:成功,返回一个迭代器,迭代器中包含所有符合条件的子串,找不到
-
split(正则表达式,字符串)
- 功能:将字符串中所有满足条件的子串作为切割点
- 返回值:成功返回切割后的列表,失败,就是列表中只有一个元素
- 举例:
- str1 = ‘cdscsuibcacdscsdcc’
- result = split(r’a|d’,str1)
-
sub(正则表达式,字符串1,字符串2)
- 功能:将字符串2中所有满足正则的子串都替换成字符串1
3.匹配对象
- 拿到匹配对象后能干什么:
- 获取整个正则表达式对应的匹配结果(match=):result.group()
- 手动捕获某个分组对应的匹配结果:result.group(分组数)
- 获取匹配结果在原字符串中的位置:result.span(分组数) 分组数可以不写,不写是大的 ,有分组,就发生捕获。都会返回一个元组,(开始下标,结束下标)
4. 参数
- 正则匹配忽略大小写
- 写法“fullmatch(r’(?i)abc’,aBc) 引号里开头写入(?i)
- 单行匹配 :
- 多行匹配:匹配时,.不能和换行(\n)进行匹配,需要先将其转化为单行匹配
- 方法:引号里的开头加上(?s)
from re import match
var = 'abcd'
result = match(r'ab',var)
print(result)
from re import match
str2 = '23MKJ==MKJ23'
result = fullmatch(r'(\d{2})([A-Z]{3})==\2\1',str2)
print(result)