正则表达式
动机 |
| |
定义 | 即文本的高级匹配模式,提供搜索,替代,查找等功能 本质是由以系列特殊符号和字符组成的字串
| |
目标 |
| |
特点 |
| |
python ---- > re 模块 | 处理正则表达式 re.dindall(pattern,string) 功能: 使用正则表达式匹配字符串 参数: pattern 正则表达式字符串 String 目标字符串 返回值: 返回匹配到的所有内容
例子: import re s = "my enail is Levi@126.com or lvze@tedu.cn" re.findall("\w+@\w+\.\w{2,3}",s) ['Levi@126.com', 'lvze@tedu.cn']
| |
元字符 | (正则表达式中有一定含义的符号)
元字符 a b c & # 匹配规则: 匹配字符本身 例子: In [5]: re.findall("abc","abcbdkd") Out[5]: ['abc']
元字符 匹配规则: 匹配 | 两边任意一个正则表达式 例子: In [12]: re.findall('ab|cd',"abfscdaadsab") Out[12]: ['ab', 'cd', 'ab']
重复的字符不可匹配 In [13]: re.findall('abc|bcd',"abcdefabc") Out[13]: ['abc', 'abc']
元字符: . 匹配规则: 匹配出\n外任意一个字符 例子: In [14]: re.findall('f.o',"fao is not foo") Out[14]: ['fao', 'foo']
元字符: ^ 匹配规则: 匹配一个字符串的开头位置 例子: In [15]: re.findall('^hello',"hello world") Out[15]: ['hello']
In [16]: re.findall('^hello',"hello world hello") Out[16]: ['hello']
元字符: $ 匹配规则: 匹配字符串的结束位置 例子: In [25]: re.findall("py$","hello.py") Out[25]: ['py']
In [26]: re.findall("......py$","hello.py") Out[26]: ['hello.py']
元字符: * 匹配规则: 匹配前面的正则表达式重复0此或者是多次 例子: In [27]: re.findall("ab*","abbsafab") Out[27]: ['abb', 'a', 'ab']
元字符: + 匹配规则: 匹配前面的正则表达式1次或多次 例子: In [28]: re.findall("ab+","abbsafab") Out[28]: ['abb', 'ab']
元字符: ? 匹配规则: 匹配前面出现的元字符0次或1次 例子 In [31]: re.findall("ab?","abbsafab") Out[31]: ['ab', 'a', 'ab']
元字符: {n} 匹配规则: 匹配前面的正则表达式n次 例子: In [32]: re.findall("ab{3}","abbbsafab") Out[32]: ['abbb']
元字符:{m,n} 匹配规则: 匹配前面的正则表达式 m – n 次 例子: In [35]: re.findall("ab{2,4}","abbbsabbfab") Out[35]: ['abbb', 'abb']
元字符:[字符集] 匹配规则: 匹配括号内任意一个字符 例子: In [36]: re.findall("[a-z]","hello 123") Out[36]: ['h', 'e', 'l', 'l', 'o']
In [37]: re.findall("[a-z]+","hello 123") Out[37]: ['hello']
元字符:[^ …] 匹配规则: 除了字符集中的任意一个字符 例子: In [38]: re.findall("[^abcdef]","a little boy") Out[38]: [' ', 'l', 'i', 't', 't', 'l', ' ', 'o', 'y']
In [39]: re.findall("[^abcdef]+","a little boy") Out[39]: [' littl', ' ', 'oy']
元字符: \d \D 匹配规则: \d 匹配任意数字字符 \D 匹配任意非数字字符 例子: In [43]: re.findall("1\d{10}","a 12345678987654321") Out[43]: ['12345678987']
In [45]: re.findall("\D+","The num is 123456") Out[45]: ['The num is ']
元字符: \w \W 匹配规则:\w 匹配任意一个普通字符[_0-9a-aA-Z] \W 匹配任意一个非普通字符[^_0-9a-aA-Z] 例子: In [3]: re.findall('\w+',"Today is wednesday") Out[3]: ['Today', 'is', 'wednesday']
In [6]: re.findall('\W+',"@#$%^&*") Out[6]: ['@#$%^&*']
元字符:\s \S 匹配规则: \s 匹配任意空字符 \S 匹配任意非空字符 例子:
In [7]: re.findall('\s+',"hello wold") Out[7]: [' ']
In [8]: re.findall('\S+',"hello wold") Out[8]: ['hello', 'wold']
元字符: \A(^) \Z($) 匹配规则: 匹配字符串的开始和结束位置 例子: In [12]: re.findall('\Ahello world\Z',"hello world") Out[12]: ['hello world']
元字符: \b \B 匹配规则:\b 单词边界 \B 非单词边界 例子: In [13]: re.findall(r'\bis\b',"This is Tom") Out[13]: ['is']
元字符总结: 匹配单个字符:a . \d \D \w \W s \S […] [^…] 匹配重复性: * + ? {n} {m,n} 匹配位置: ^ $ \A \Z \b \B | |
正则表达式转义
特殊符号 | . * ? $ [] () {} ^ \
例子: In [4]: re.findall('ok\\?',"Are your ok?") Out[4]: ['ok?'] |
r ---- >raw 字符串 | 原生字符串,字符串的内容就是字符串本身,不进行任何转义处理 |
贪婪和非贪婪
贪婪模式 | 正则表达式的重复默认总是尽可能多的向后匹配内容 |
非贪婪模式 | 尽可能少的匹配内容
|
贪婪转为非贪婪 |
后面加? (1)非贪婪 In [16]: re.findall(r'ab*?',"abbcavvaa") Out[16]: ['a', 'a', 'a', 'a']
(2)贪婪 In [17]: re.findall(r'ab*',"abbcavvaa") Out[17]: ['abb', 'a', 'a', 'a'] |
正则表达式分组
方法 | 可以使用()为一个正则表达式子组, 子组可以看做正则表达式的一个局部整体 |
子组的作用 |
例子: In [21]: re.search(r'(ab)+','abbbbbcdef').group() Out[21]: 'ab'
In [22]: re.search(r'(ab)+','ababababcdef').group() Out[22]: 'abababab'
In [23]: re.search(r'.+(\.com|\.cn)','abc@123.cn').group() Out[23]: 'abc@123.cn' |
例子: In [27]: re.search(r'(ab)+','ababababcdef').group(1) Out[27]: 'ab' | |
子组的使用注意事项 |
((ab)cd(ef)g) abcefg ab ef
|
捕获组合非捕获组 (命名组,非命名组) | 格式: (?P<name>pattern)
例子: In [29]: re.search(r'(?P<dag>ab)cdef+','ababababcdef').group() Out[29]: 'abcdef' |
命名作用 |
格式:(?P=name)
例子: In [32]: re.search(r'(?P<dog>ab)cd(?P=dog)','abcdabefg').group() Out[32]: 'abcdab' |
正则表达式设计原则 |
|
re模块
方式 | regex = re . comoile(pattern,flags = 0) 功能: 生成正则表达式 参数: pattern 正则表达式 flags 功能标志位,丰富正则的匹配功能 返回值: 返回正则表达式对象
****************************************** list = re . findall(pattern,string,flags) 功能: 根据正则表达式匹配目标字符串 参数: pattern 正则表达式 string 目标字符串 返回值: 返回一个列表,内部为匹配到的内容
**************************************** list = regex . findall(string,pos=0,endpos = 9999….) 功能: 根据正则表达式匹配目标字符串 参数: string 目标字符串 pos 标明从目标字符串的哪个位置开始匹配 endpos 标明匹配到目标字符串的哪里 返回值: 返回一个列表,内部为匹配到的内容
re.split(pattern,atring,flsgs=0) 功能: 通过正则表达式分隔字符串 参数: pattern 正则 String 目标字符串 返回值: 分隔后字符串列表
*************************************** re.sub(pattern , replaceStr , atring , max , flags) 功能: 替换正则表达式匹配到的内容 参数: pattern 正则 replaceStr 要替换的内容 string 目标字符串 max 最多替换几处 返回值: 返回替换的字符串
***************************************** re.subn(pattern , replaceStr , atring , max , flags) 功能: 替换正则表达式匹配到的内容 参数: pattern 正则 replaceStr 要替换的内容 string 目标字符串 max 最多替换几处 返回值: 返回替换的字符串和几处
****************************************** re.finditer(pattern , string , flags) 功能: 使用正则表达式匹配目标字符串 参数: pastern 正则 String 目标字符串 返回值: 将匹配内容生成迭代器
******************************************** re.fullmatch(pattern , string , flags) 功能: 完全匹配目标字符串 参数: pattern 正则 String 目标字符串 返回值: 匹配到的内容(match object)
******************************************* obj = re.match (pattern , string , flags) 功能: 匹配目标字符串开头 参数: pattern 正则 String 目标字符串 返回值: 匹配到的内容(match object) obj = re.search (pattern , string , flags) 功能: 匹配目标字符串,只能匹配第一处 参数: pattern 正则 String 目标字符串 返回值: 匹配到的内容(match object)
|
Compile 生成的正则对象属性 | pattern 正则对象对应的正则表达式 flags 获取标志位值 groupinddex 获取捕获组形成的字典 groups 多少字组 |
match对象
属性变量
| pos : 目标字符串的开头位置 endpos : 目标字符串结束位置 re : 正则表达式对象 string : 目标字符串 lastgroup:最后一组名字 lastindex:最后一组是第几组
|
属性方法
| start() 获取匹配到的内容的开始位置 end() 获取匹配到的内容的结束位置 span() 获取匹配到的内容的起止位置
group(n = 0) 功能: 获取match对象对应匹配到的内容 参数: 默认为0表示获取正则表达式整的匹配内容 如果赋值1,2,3...则表示获取某个子组的匹配内容 返回值:返回匹配字符串
groups() 获取所有子组匹配内容 groupdict() 将所有捕获组内容形成一个字典 |
flags 参数
| re.compile re.findall re.search re.match re.finditer re.fullmatch re.sub re.subn re.split
作用: 辅助正则表达式,丰富匹配结果 A == ASCII S == DOTALL 元字符.可以匹配\n I == IGNORECASE 或略大小写 L == LOCALE M == MULTILINE 元字符^ $ 可以匹配每一行的开头结尾位置 T == TEMPLATE U == UNICODE X == VERBOSE 可以给正则添加注释 同时使用多个flag 用 | re.I | re.S
|