概念
正则表达式是对字符串操作的一种逻辑公式。用于搜索、替换和解析字符串。
作用
- 1、给定字符串是否符合正则表达式的过滤逻辑(匹配)
- 2、从字符串中获想要的特定部分
- 3、对目标字符串进行替换
常用的字符
| 符号 |
描述 |
| . |
匹配任意一个字符(除了\n) |
| [] |
匹配列表中的字符 |
| \w |
匹配字母、数字、下划线、即a-z,A-Z,0-9,_ |
| \W |
匹配不是字母、数字、下划线 |
| \s |
匹配空白字符,即空格(\n, \t) |
| \S |
匹配不是空白的字符 |
| \d |
匹配数字,即0-9 |
| \D |
匹配非数字的字符 |
常用的限定符
| 符号 |
描述 |
| * |
匹配零次或者多次 |
| + |
匹配一次或者多次 |
| ? |
匹配一次或者零次 |
|
重复m次 |
|
重复m到n次,其中n可以省略,表示m到任意次 |
|
至少m次 |
常用修饰符 - 可选标志
| 修饰符 |
描述 |
| re.I |
不区分大小写 |
| re.L |
做本地识别(locale-aware)匹配 |
| re.M |
多行匹配,影响 ^ 和 $ |
| re.S |
使 . 匹配包括换行在内的所有字符 |
| re.U |
根据Unicode字符集解析字符。这个标志影响 \w, \W, \B ,\b |
| re.X |
给与更灵活的格式以便将正则表达式写的易于理解 |
原生字符串
- 正则表达式里面使用 "" 作为转义字符,可能会造成反斜杠困扰。
- 使用原生字符解决困扰,使用 r 的前缀
边界字符
| 字符 |
描述 |
| ^ |
匹配字符串的开头 |
| $ |
匹配字符串结尾 |
| \b |
匹配一个单词的边界 |
| \B |
匹配非单词的边界 |
*** ^ 和 [^m] 中的“^”的含义并不相同,后者“^”表示“除了….”的意思**
匹配多个字符串
- search()方法搜索多个字符串,使用择一匹配符号 | ,择一符号和逻辑差不多,只要满足其中一个,就匹配成功
分组
- 一个模式字符串中有用一堆圆括号括起来的部分,这个部分就会作为一组,可以通过group()方法指定组的匹配字符串
| 字符 |
描述 |
| (ab) |
将括号中的字符作为一个分组 |
| \num |
引用分组num匹配到的字符串 |
| (?P<name>) |
分别起组名 |
| (?P=name) |
引用别名为name分组匹配到的字符串 |
- 用 group 方法获取指定组的值时,组从 1 开始,也就是说,group(1)获取第 1 组的 值,group(2)获取第 2 组的值,以此类推。
- groups 方法用于获取所有组的值,以元组形式返回。所以除了使用 group(1)获取第 1 组的值外,还可以使用 groups()[0]获取第 1 组的值。获取第 2 组以及其它组的值 的方式类似。
re模块中的常用函数
1、match()方法
- 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。
- 格式语法:re.match(pattern, string, flags=0)
pattern: 匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
- 匹配成功,可以调用对象中的group()方法获取字符串
2、search()方法
- 在一个字符串中搜索满足文本模式的字符串
- 语法格式:re.search(pattern, string, flags=0)
pattern: 匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
*match() 和 search()的区别
- match()是从字符串的开始匹配,字符串开始不符合正则表达式,就匹配失败,返回None;而search()是匹配整个字符串,直到找到一个子字符串为止,匹配失败的话,返回None。
3、sub()与subn()方法
- 这两个函数用于实现搜索和替换功能,功能基本完全一样。不同的是返回值,sub()函数返回的是替换后的结果,subn()函数返回一个元组,元组的第一个元素是替换后的结果,第二个是元素是替换的总数
语法格式:re.sub(pattern, repl, string, count=0, flags=0)
pattern: 匹配的正则表达式
repl: 替换的字符串,也可以是一个函数
string: 要被替换的原始字符串
count: 模式匹配后替换的最大次数,默认为 0 表示替换所有匹配的
4、compile()方法
- 用于编译正则表达式,生成一个正则表达式对象,供给match()方法和search()方法使用
- 语法格式:re.compile(pattern[,flags])
pattern: 一个字符串形式的正则表达式
flags: 可选,表示匹配模式,比如忽略大小写,多行模式等等
5、findall()方法
- 在字符串中找到正则表达式所匹配的所有子串,并翻译个列表,如果没有找到匹配的,返回空列表
- 语法格式: findall(pattern, string, flags=0)
pattern: 匹配的正则表达式
string: 要匹配的字符串
flags: 标志位,用于控制正则表达式的匹配方式
6、finditer()方法
- 和fandall()方法差不多,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
7、split()方法
- 根据正则表达式分隔字符串,返回一个列表形式的分隔结果,每一个列表元素都是分割的子字符串。
- 语法格式: re.split(pattern, string[,maxsplit=0, flags=0])
pattern: 匹配的正则表达式
string: 要匹配的字符串
maxsplit: 分隔次数,默认为 0, 不限制次数
flags: 标志位,用于控制正则表达式的匹配方式
贪婪模式和非贪婪模式
- 贪婪模式是指python里面数量词默认是贪婪的,尽可能多的匹配字符。非贪婪模式则是尽可能少的匹配字符。
- 可以在 '*', '?', '+', '{m,n}'后面加上?, 是贪婪模式变成非贪婪模式.