正则表达式
动机
1.处理文本成为计算机常见工作之一
2.对文本内容的搜索提取是一项比较复杂困难的工作
3.为了快速方便处理上述问题,正则表达式技术诞生,逐渐被发展为一个被众多语言使用的独立技术
定义:即高级文本匹配模式,提供了搜索,替代等功能,本质是由一系列特殊符号和字符组成的字串
这个字串即是正则表达式,这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串
目标:
1.熟练使用正则表达式符号
2.正确的组合和理解一般的正则表达式
3.能够使用python操作正则表达式
正则表达式的特点
1.方便进行检索和修改
2.支持语言众多
3.灵活多样
4.mongo正则类型,django等框架作为url匹配,爬虫
正则表达式的使用
python—>re模块 处理正则表达式
re.findall(pattern,string)
功能:使用正则表达式匹配字符串
参数:pattern 正则表达式
string 目标字符串
返回值:一个列表,匹配到的所有内容
元字符(即正则表达式中有特殊含义的符号)
1.普通字符
元字符:abc
匹配规则:匹配响应的普通字符
2.或
元字符:|
匹配规则:匹配|两边任意一个正则表达式符合的情况
| 两侧不要有没用的空格
3.匹配单一字符
元字符:.
匹配规则:匹配除了换行之外的任意字符
f.o –> foo fao f#o …
4.匹配开始位置
元字符: ^
匹配规则:匹配一个字符串的开始位置
5.匹配结束位置
元字符:$
匹配规则:匹配目标字符串的结束位置
py$ —> hello.py
6.匹配重复
元字符:*
匹配规则:匹配前面的正则表达式重复0次或多次
7.匹配重复
元字符:+
匹配规则:匹配前面的正则表达式重复1次或多次
ab+ —>ab abb abbb …
8.匹配重复
元字符:?
匹配规则:匹配前面的正则表达式重复0次或1次
ab? —>a,ab
9.匹配重复
元字符:{n}
匹配规则:匹配指定的重复次数
ab{3}—>abbb
10.匹配重复
元字符:{m,n}
匹配规则:匹配前面的正则表达式m次到n次
ab{3,5}—> abbb,abbbb,abbbbb
11.匹配字符集合
元字符:[]
匹配规则:匹配中括号内的任意一个字符
[abcd1] a b c d 1
[a-z]
[A-Z]
[0-9]
[123a-zA-Z]
12.匹配字符集合
元字符:[^…]
匹配规则:匹配除指定字符集之外的任意字符
13.匹配任意(非)数字字符
元字符:\d \D
匹配规则:\d 匹配任意数字字符 [0-9]
\D 匹配任意非数字字符 [^0-9]
14.匹配(非)普通字符(普通字符:数字,字母,下划线)
元字符:\w \W
匹配规则:\w 匹配任意一个普通字符 [_0-9a-zA-Z]
\W 匹配任意一个非普通字符 [^_0-9a-zA-Z]
15.匹配(非)空字符
元字符:\s \S
匹配规则:\s 匹配任意一个空字符
\S 匹配任意一个非空字符
空字符:[ \n\t\r]
16.匹配起止位置
元字符: \A \Z
匹配规则:\A 匹配开始位置 ^
\Z 匹配结束位置 $
绝对匹配 \Aabc\Z —> abc 只能是abc
17.匹配(非)单词边界位置
元字符:\b \B
匹配规则:\b 匹配单词边界
\B 匹配非单词边界
单词边界:数字字母下划线和其他字符的交界位置为单词的边界
元字符总结:
匹配单个字符:a . \d \D \w \W \s \S [] [^…]
匹配重复性:* + ? {N} {m,n}
匹配某个位置:^ $ \A \Z \b \B
其他:| () \
re.findall(‘^\d[0-9a-zA-Z]{7,9}’,’1caijie2b’)
正则表达式特殊符号
. * ? $ ‘’ “” [] {}() \ ^
如果想匹配特殊符号则加转义
贪婪和非贪婪
正则表达式默认的重复匹配模式:贪婪模式
尽可能多的向后匹配
- ? {m,n} 这四种情况下会产生贪婪模式
非贪婪模式:尽可能少的匹配内容,满足正则表达式含义即可
- ? {m,n} 这四种情况下会产生贪婪模式
贪婪—>非贪婪 *? +? ?? {m,n}?
正则表达式分组
使用()可以为一个正则表达式建立一个子组,子组可以看做内部的整体
abcd(ef)—> abcdef
子组的作用
1.增加子组后对正则表达式整体的匹配内容没有影响
2.子组可以改变重复元字符的重复行为
3.子组在某些操作中可以对子组匹配内容单独提取
子组的注意事项
1.每个正则表达式可以有多个子组,由外到内,由左到右为第一,第二…子组
2.子组通常不要交叉
捕获组和非捕获组(命名组和非命名组)
子组命名格式
(?P
很多编程接口可以直接通过名字获取子组匹配内容
捕获组中的正则表达式可以通过名字重复调用
调用:(?P=name)
(?P
re模块
compile(pattern,flags=0)
功能:获取正则表达式对象
参数:pattern:正则表达式
falgs:功能标志位,提供更丰富的匹配
返回值:正则表达式对象
re模块和compile对象均有的函数
obj.findall(string,pos,endpos)
功能:通过正则表达式匹配字符串
参数:string 目标字符串
pos 目标字符串的匹配开始位置
posend 目标字符串的匹配结束位置
返回值:匹配到的所有内容以列表返回
如果正则表达式有子组的话则只显示子组匹配内容
obj.split(string)
功能:按照正则表达式切割字符串
参数:目标字符串
返回值:切割后的内容,以列表的形式返回
obj.sub(replaceStr,string,count)
功能:替换正则表达式匹配的内容
参数:replaceStr 要替换的内容
string 目标字符串
count 最多替换几处
返回值:返回替换后的字符串
obj.subn(repl,string,count)
功能:替换正则表达式匹配的内容
参数:replaceStr 要替换的内容
string 目标字符串
count 最多替换几处
返回值:返回替换后的字符串和实际替换的个数
obj.finditer()
功能:使用正则表达式匹配目标内容
参数:目标字符串
返回值:迭代对象,迭代的每个对象为一个match对象
re.match(pattern,string)
功能:匹配一个字符串的开头
参数:目标字符串
返回值:迭代对象,迭代的每个对象为一个match对象
没有匹配返回None
re.search(pattern,string)
功能:匹配一个字符串
参数:目标字符串
返回值:如果匹配返回match obj
没有匹配返回None
match 只能匹配字符串的开头,search可以匹配任意字符位置,但是也只能匹配一次
match对象调用其他属性时往往需要try异常处理
re.fullmatch()
要求目标字符串完全匹配
compile对象属性方法(re模块没有)
flags:标志位
pattern:正则表达式
groupindex:捕获组
groups:多少个子组
match对象属性方法
pos:目标字符串的开头位置
endpos:目标字符串的结束位置
re:正则表达式对象
lastgroup:最后一组的名字
lastindex: 最后一组是第几组
string:目标字符串
start():匹配到内容的开始位置
end(): 匹配到内容的结束位置
span():匹配到内容的起止位置
group(n):
功能:获取match对象匹配的内容
参数:默认为0,表示获取正则整体的匹配内容
如果传入大于0的整数则表示获取对应子组匹配内容
返回值:返回匹配到的内容
groups():
功能:得到所有子组匹配的内容
groupdict():
功能:得到所有捕获组匹配的内容