动机
- 处理文本成为计算机常见工作之一
- 对文本内容的搜索提取是一项比较复杂困难的工作
- 为了快速方便处理上述问题,正则表达式技术诞生,逐渐发展为一个被众多语言使用的独立技术
定义
即高级文本匹配模式,提供了搜索,替代等功能。本质是由一系列特殊符号和字符组成的字串,这个字串即使正则表达式。这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串。
目标:
1. 熟练使用正则表达式符号
2. 能够正确的组合和理解一般的正则表达式
3. 能够使用python操作正则表达式
正则表达式特点:
* 方便进行检索和修改
* 支持语言众多
* 灵活多样
* mongo正则类型,django等框架作为url匹配,爬虫
正则表达式的使用
python —> re模块 处理正则表达式
re.findall(pattern, string)
功能:使用正则表达式匹配字符串
参数:pattern 正则表达式
string 目标字符串
返回值:一个列表 匹配到的所有内容
元字符
(即正则表达式中有特殊含义的符号)
1. 普通字符
元字符:abc (数字字母下划线)
匹配规则:匹配相应的普通字符
2. 或
元字符:ab|cd
匹配规则:匹配|两边任意一个正则表达式符合的情况
**|两侧不要有没用的空格,并且检索时元素不会重叠得到结果
3. 匹配单一字符
元字符:.
匹配规则:匹配除了换行之外的任意字符
4. 匹配开始位置
元字符:^
匹配规则:匹配一个字符串的开始位置
5. 匹配结束位置
元字符:$
匹配规则:匹配目标字符串的结束位置
6. 匹配重复
元字符:*
匹配规则:匹配前面的正则表达式重复0次或多次
7. 匹配重复
元字符:+
匹配规则:匹配前面的正则表达式重复1次或多次
8. 匹配重复
元字符:?
匹配规则:匹配前面的正则表达式重复0次或1次
9. 匹配重复
元字符:{n}
匹配规则:匹配指定的重复次数
10. 匹配重复
元字符:{m,n}
匹配规则:匹配前面的正则表达式重复m次到n次
11. 匹配字符集合
元字符:[]
匹配规则:匹配括号范围内的任意一个字符
[abc123d]
[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 匹配任意非空字符
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
其他:
| () \
转义字符
贪婪和非贪婪
正则表达式默认的重复匹配模式:贪婪模式
当匹配到的时候,会尽可能多的向后匹配
* + ?{m,n} 这四种情况下会产生贪婪模式
非贪婪模式:尽可能少的匹配内容,满足正则表达式含义即可
贪婪 —> 非贪婪 *? +? ?? {m,n}?
正则表达式分组
使用()可以为一个正则表达式建立一个子组,子组可以看作内部的整体
子组的作用
1.增加子组后对正则表达式整体的匹配内容没有影响
2.子组可以改变重复元字符的重复行为
3.子组在某些操作中可以对子组匹配内容单独提取
子组的注意事项
1.每个正则表达式可以有多个子组,由外到内,由左到右为第1,第n…子组
2.子组通常不要交叉
捕获组和非捕获组(命名组和非命名组)
子组命名格式
(?P< name>abc)
1.很多编程接口可以直接通过名字获取子组匹配内容
2.捕获组中的正则表达式可以通过名字重复调用
(?P=name)
匹配身份证号
re模块
compile(pattern, flags=0)
功能:获取正则表达式对象
参数:pattern 正则表达式
flags 功能标志位,提供更丰富的匹配
返回值:正则表达式对象
re模块和compile对象均有的函数
obj.findall(string, pos, endpos)
功能:通过正则表达式匹配字符串
参数:string 目标字符串
pos 目标字符串的匹配开始位置
endpos 目标字符串的结束位置
返回值:匹配到的所有内容以列表返回
*如果正则表达式有子组则只显示子组匹配内容
obj.split(string)
功能:按照正则表达式切割目标字符串
参数:目标字符串
返回值:切割后的内容
obj.sub(replaceStr, string, max)
功能:替换正则表达式匹配到的内容
参数: replaceStr 要替换的内容
string 目标字符串
max 最多替换几处
返回值:返回替换后的字符串
obj.subn(repl, string, count)
功能:替换正则表达式匹配到的内容
参数: repl 要替换的内容
string 目标字符串
count 最多替换几处
返回值:返回替换后的字符串和实际替换的个数
re.finditer(pattern, string)
功能:使用正则表达式匹配目标内容
参数:目标字符串
返回值:迭代对象 迭代的每个内容为一个match对象
re.match(pattern, string)
功能:匹配一个字符串开头
参数:目标字符串
返回值:如果匹配到返回 match obj
没有匹配到返回 None
re.search(pattern, string)
功能:匹配一个字符串
参数:目标字符串
返回值:如果匹配到返回 match obj
没有匹配到返回 None
* match 只能匹配字符串的开头位置,search可以匹配任意位置,但是也只能匹配一处
* 通常match对象调用其属性时往往需要try异常处理
fullmatch()
要求目标字符串完全匹配,没有完全匹配会报错
compile 对象 属性方法 (re模块没有)
flags:标志位
pattern:正则表达式
groupindex:捕获组形成的字典
groups:多少个子组
match 对象属性方法
属性
match_obj.pos 目标字符串的开头位置
match_obj.endpos 目标字符串的结束位置
match_obj.re 正则表达式对象
match_obj.string 目标字符串
match_obj.lastgroup 最后一组的名字
match_obj.lastindex 最后一组是第几组
方法
match_obj.start() 匹配到的内容的开始位置
match_obj.end() 匹配到的内容的结束位置
match_obj.span() 匹配到内容的起止位置(即将以上两项形成一个二元元组返回)
match_obj.group(n)
功能:获取match对象匹配的内容
参数:默认为0,表示获取正则整体的匹配内容
如果传入大于0的正数则表示获取对应子组匹配内容
返回值:返回匹配到的内容
match_obj.groups()
功能:得到所有子组匹配的内容
match_obj.groupdict()
功能:得到所有捕获组匹配的内容
返回值:字典,键为组名,值为子组
作业:
读取一个文件内容,将文件中所有的以大写字母开头的单词匹配出来