1.正则表达式
正则表达式是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
2.元字符
. 匹配任意字符(不包括换行符)
^ 匹配开始位置,多行模式下匹配每一行的开始
$ 匹配结束位置,多行模式下匹配每一行的结束
* 匹配前一个元字符0到多次
+ 匹配前一个元字符1到多次
? 匹配前一个元字符0到1次
{m,n} 匹配前一个元字符m到n次
\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义
[] 字符集,一个字符的集合,可匹配其中任意一个字符
(...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值
| 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
3.转义符\
(1) 反斜杠后跟元字符去除特殊功能,如’\.’只能匹配’.’
(2) 反斜杠后跟普通字符实现特殊功能
\d 匹配任何十进制数; 它相当于类 [0-9]。
\D 匹配任何非数字字符; 它相当于类 [^0-9]。
\s 匹配任何空白字符; 它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符; 它相当于类 [^ \t\n\r\f\v]。
\w 匹配数字、字母、下划线中任意一个字符; 它相当于类 [a-zA-Z0-9_]。
\W 匹配非数字、字母、下划线中的任意字符; 它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
\B 匹配不位于单词开始或结束位置的空字符串
\A 匹配字符串开始位置,忽略多行模式
\Z 匹配字符串结束位置,忽略多行模式
\number 匹配和前面索引为number的分组捕获到的内容一样的字符串
4.分组()
python的正则表达式中用小括号 “()” 表示分组,按照每个分组中前半部分出现的顺序 “(” 判定分组的索引,索引从 1 开始,每个分组在访问的时候可以使用索引,也可以使用别名
(?P<name>...) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
(?P=name) 分组的引用模式,可在同一个正则表达式引用前面命名过的正则
(?:...) 分组的不捕获模式,计算索引时会跳过这个分组
(?iLmsux) 分组中可以设置模式,iLmsux之中的每个字符代表一个模式
(?#...) 注释,不影响正则表达式其它部分
(?(id/name)yes|no) 若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则
例:匹配标签:
import re
print(re.findall("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>"))
print(re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>"))
print(re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>"))
5.环视用法
环视是一种特殊的正则语法,它匹配的不是字符串,而是位置,其实就是使用正则来说明这个位置的左右应该是什么或者应该不是什么,然后去寻找这个位置。
(?=...) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则
(?!...) 顺序否定环视,表示所在位置右侧不能匹配括号内正则
(?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
(?<!...) 逆序否定环视,表示所在位置左侧不能匹配括号内正则
6.字符集[]
字符集[]只匹配其中一个元素。
字符集中有功能的符号:- ^ \
- 例如[a-z]匹配任意小写字母
^ 对^后面的字符集中的所有正则取反
\ 例如[\d]匹配任意十进制数
7.贪婪匹配
贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配
几个常用的非贪婪匹配
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
.*? 取尽量少的任意字符
.*?x 取任意字符直到x出现
8.re模块下的常用方法
(1)findall(pattern, string, flags=0)
在待操作字符串中寻找所有匹配正则表达式的字串,返回一个列表,如果没有匹配到任何子串,返回一个空列表。
在findall的正则(pattern)中使用分组会优先显示分组中匹配的内容。
(2)search(pattern, string, flags=0)
返回匹配上的第一个字串,并且不再继续找,返回一个对象,没有找到返回None
(3)match(pattern, string, flags=0)
与search类似,但match只从字符串开始处开始查找的,如果开始处不匹配,则不再继续寻找。
(4)compile(pattern, flags=0)
编译一个正则模式,给定一个正则表达式 pattern,指定使用的模式 flags ,默认为0 即不使用任何模式,然后会返回一个对象这个对象可以调用其他函数来匹配
例:
s=’abc’
obj = re.compile(‘a’,re.S)
print(obj.findall(s))
(5)finditer(pattern, string, flags=0)
参数和作用与 findall 一样,不同之处在于 findall 返回一个列表, finditer 返回一个迭代器。
(6)split(pattern, string, maxsplit=0, flags=0)
用匹配pattern的子串来分割string,如果pattern里使用了圆括号,那么被pattern匹配到的串也将作为返回值列表的一部分。如果maxsplit不为0,则最多被分割为maxsplit个子串,剩余部分将整个地被返回。
(7)sub(pattern, repl, string, count=0, flags=0)
替换,将string里,匹配pattern的部分,用repl替换掉,最多替换count次(剩余的匹配将不做处理),然后返回替换后的字符串。如果string里没有可以匹配pattern的串,将被原封不动地返回。
(8)subn(pattern, repl, string, count=0, flags=0)
跟上面的sub()函数一样,只是它返回的是一个元组 (新字符串, 匹配到的次数)
(9)escape(string)
转义
(10)purge()
清除缓存中的正则表达式,在需要优化占用内存的时候会用到。
9.模式flags
当以给flags赋值的方式来使用模块时,即对前面的所有正则运用模块,或者也可以在分组前加上(?iLmsux)的方式来使用模块,这样只对单个分组使用模块。
I 忽略大小写的匹配模式
L 字符集本地化。
M 多行模式, 改变 ^ 和 $ 的行为
S 此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符
X 冗余模式, 此模式忽略正则表达式中的空白和#号的注释
U UNICODE,使用 \w, \W, \b, \B 这些元字符时将按照 UNICODE 定义的属性.