1.什么是正则表达式
正则表达式是字符串匹配工具,它是为了在某些需求下可以更方便、更快速的处理字符串
2.怎么使用正则处理字符串
python通过提供re模块来支持正则表达式
3.怎么写正则表达式
python中正则表达式是放在字符串中,并且这个字符串一般会在外面加r/R取消python语法的转译
4.正则语法
正则字符 | 意义 |
---|---|
普通字符 abc | 匹配对应普通字符 |
. | 匹配任意字符 |
\w | 匹配ASCII中字母数字下划线,和unicode中除ASCII码中的内容 |
\s | 匹配一个空白字符 包括空格回车,制表符 |
\d | 匹配一个数字字符 |
\b | 检测单词边界 检测字符不参与匹配在匹配完成后判断检测字符位置是否满足检测字符要求 |
^ | 检测是否是字符串开头 |
$ | 检测是否是字符串结尾 |
\大写字母 | 对小写字母功能的否定选择 |
\W | 匹配非数字、字母、下划线 |
\S | 匹配非空白字符 |
\D | 匹配非数字字符 |
\B | 检测非单词边界 |
字符集[] 匹配[]中任意一个字符
- [] 中可使用 a-b 表示 编码值从a到b的的所有字符
要求a的编码值小于b的编码值,-不在字符中间则值表示字符- - 在[]内容的最前面加^表示否定(除了[]中内容的其他所有内容)
正则表达式 | 意义 |
---|---|
[一-龥] | 所有中文 |
[a-zA-Z] | 所有字母 |
[a-zA-Z\d_] | 数字、字母、下划线 |
取消特殊符号的转译
原理可认为\取消了其后面一个字符的特殊功能
如\\表示一个普通\,\\w则表示普通的\和普通的w
- 在[] 外的情况
特殊意义符号前面加\ 让其特殊意义消失 - 在中括号里的意义
单独有特殊意义的符号, 除了^在最前面, - 在两个字符之间,其余的都失去特殊意义
5.匹配次数
均做用于次数符号前的一个字符或者组
正则符号 | 意义 |
---|---|
* | 匹配0次或者多次 |
+ | 匹配一次或者多次 |
{N} | 匹配N次 |
{M,N} | 匹配M次到N次 |
{M,} | 匹配M次以上 |
{,N} | 匹配N次以上 |
? | 匹配0次或者1次 |
贪婪和非贪婪匹配
- 在匹配次数不确定的情况下默认是贪婪匹配(尽可能多匹配)
- 在匹配次数不确定呢的符号后加? 则变成非贪婪匹配(尽可能少匹配)
6. 分支/选择 |
- 存在短路匹配现象
如 正则1|正则2|正则3|...
优先使用正则1匹配,如匹配到 则不会进行后面的正则式的匹配,如未匹配到 换 正则2 匹配,依次直到最后一个正则式
7.分组 ()
将小括号中的内容作为一个整体操作 可以在其后使用 \数字 表示重复第几个括号所匹配的结果,
注意 \数字只能写在()后, 数字最大只能是前面出现()的个数
8.re模块方法
1.完全匹配 - 让字符串长度和字符串每个字符的值和正则表达式完全匹配
- re.fullmatch(正则表达式,字符串)
匹配成功则返回匹配的 Match对象 失败则返回None
通常用于检测一个字符串是否合法
Match对象包含多种属性可通过对应的方法调用
result = re.fullmatch(r'(\d{3})=([a-z]{3})', '234=haj')
print(result)
# 1) 匹配到的内容在原字符串中的位置
print(result.span()) # 整个正则表达式匹配结果的范围
print(result.span(1)) # 正则表达式中第一个分组匹配结果的范围
print(result.span(2)) # 正则表达式中第二个分组匹配结果的范围
print(result.start(2), result.end(2))
# 2) 获取匹配到的值
print(result.group()) # 整个正则表达式的匹配结果
print(result.group(1))
print(result.group(2))
# 3) 获取原字符串
print(result.string)
2.match匹配字符串的开头
re.match(正则表达式, 字符串) - 判断字符串的开头是否和正则表达式相匹配。匹配成功返回匹配Match对象,匹配失败返回None
只检测字符串从开始的位置是否满足要求
3.search
re.search(正则表达式, 字符串) - 在字符串中查找是否有和正则表达式匹配的子串, 如果没有返回None, 如果有就返回第一个匹配的Match对象
4.findall
re.findall(正则表达式, 字符串) - 获取字符串中所有满足正则表达式的子串,以列表的形式返回
注意: 正则表达式中有没有分组
没有分组 - 整个正则表达式匹配的结果作为列表元素(列表元素是字符串)
有一个分组 - 这个分组匹配到的结果作为列表元素(列表元素是字符串)
多个分组 - 将元祖作为列表元素,每个分组匹配到的结果作为元祖的元素(列表元素是元祖)
5.finditer
re.finditer(正则表达式,字符串) - 获取子串中所有能够和正则表达式匹配的子串的匹配结果。
返回值是一个迭代器,迭代器中的元素是匹配Match对象
re方法 | 返回对象 |
---|---|
fullmatch | Match obj |
match | Match obj |
search | Match obj |
findall | list 元素是 匹配的字符串 |
finditer | iter 元素是匹配的 Match obj |
6.split
re.split(正则表达式,字符串) - 将字符串按照满足正则表达式的子串进行切割
7.sub
re.sub(正则表达式, 新字符串, 字符串, 替换次数) - 将字符串中满足正则表达式的子串替换成新字符串
替换次数不赋值,表示全部替换