1、动机
1、处理文本成为计算机常见工作之一2、对文本内容的搜索提取是一项比较复杂困难的工作
3、为了快速方便处理上述问题,正则表达式技术诞生,逐渐发展为一个被众多语言使用的独立技术
2、定义:
正则表达式即高级文本匹配模式,提供了搜索,替代等功能。本质是由一系列特殊符号和字符组成的字串,这个字串即是正则表达式。
这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串。
3、目标
1、熟练使用正则表达式符号2、正确组合和理解一般的正则表达式
3、能够使用Python操作正则表达式
4、正则表达式特点
1、方便进行检索和修改2、支持语言众多
3、灵活多样
4、使用场景:
1、MongoDB正则类型
2、django等框架作为URL匹配
3、爬虫
5、正则表达式的使用
1、Python re模块作用:
处理正则表达式
6、re模块函数:
1、re.fandall(pattern,string)功能:
使用正则表达式匹配字符串
参数:
pattern : 正则表达式
string : 需要匹配的目标字符串
返回值:
一个列表,匹配到的所有内容
7、元字符:
即正则表达式中有特殊定义的符号1、普通字符
元字符:abc
匹配规则
匹配相应的普通字符,就代表abc字面值
示例
s='abdlabcladgfajdhg'
re.findall('abc',s)
['abc']
2、或
元字符:ab|cd
匹配规则
匹配|两边任意一个正则表达式符合的情况
示例
s='abdlabcladgfajdhg'
re.findall('ab|cd',s)
['ab', 'ab']
注:
| 两侧不要有没用的空格
3、匹配一个单一字符
元字符:.
匹配规则
匹配处理换行外的任意字符
示例:
re.findall('f.o','foo is mot fao')
['foo', 'fao']
4、匹配开始位置
元字符:^
匹配规则:
匹配一个字符串的开始位置
示例:
一、
re.findall('^Hello','Hello world')
['Hello']
二、
re.findall('^Hello','Hi,Hello')
[]
5、匹配结束位置
元字符:$
匹配规则
匹配目标字符串的结束位置
示例:
re.findall('py$','hello.py')
['py']
6、匹配重复
元字符:*
匹配规则:
匹配前面的正则表达式重复0次或多次
示例:
re.findall('ab*','a;ladsfbvvjefnbjnabababb')
['a', 'a', 'ab', 'ab', 'abb']
7、匹配重复
元字符:+
匹配规则:
匹配前面的正则表达式重复一次或多次
示例:
re.findall('ab+','a;ladsfbvvjefnbjnabababb')
['ab', 'ab', 'abb']
8、匹配重复
元字符:?
匹配规则
匹配前面的正则表达式重复0次或一次
示例:
re.findall('ab?','abcdefa')
['ab', 'a']
9、匹配重复
元字符{n}
匹配规则:
匹配制定的重复次数
示例:
re.findall('ab{3}','abbbbbbb')
['abbb']
10、匹配重复
元字符{m,n}
匹配规则
匹配前面的正则表达式重复m次 到 n次
示例:
re.findall('ab{2,5}','abcdabbbabbbbbbb')
['abbb', 'abbbbb']
11、匹配字符集合
元字符:[]
匹配规则
匹配中括号中范围内的任意一个字符
写法:
[abc123d] 匹配 a b c 1 2 3 d
[a-z] a~z中任意一个字符
[A-Z] A~Z中任意一个字符
[0-9] 0~9中任意一个字符
[123a-zA-Z] 1 2 3 a~z和A~Z中任意一个字符
示例:
一、
re.findall('[abcd]','Hello world')
['d']
二、
re.findall('[A-Z]','Hello world')
['H']
三、
re.findall('[0-9]','Hello world 123')
['1', '2', '3']
四、
re.findall('[_0-9a-zA-Z]','Hello world 123')
['H', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '1', '2', '3']
12、匹配字符集合
元字符[^...]
匹配规则
匹配除制定字符集之外的任意字符
示例:
re.findall('[^abc]','nihao abc')
['n', 'i', 'h', 'o', ' ']
13、匹配任意数字字符/非数字字符
元字符\d \D
匹配规则:
\d 匹配任意数字字符 等同于 [0-9]
\D 匹配任意非数字字符 等同于 [^0-9]
示例:
\d示例
re.findall('1\d{10}','15478944564')
['15478944564']
\D示例
re.findall('\D','hello 123')
['h', 'e', 'l', 'l', 'o', ' ']
14、匹配普通字符/非普通字符 (普通字符:数字字母下划线)
元字符:\w \W
匹配规则
\w 匹配任意一个普通字符 等同于 [_0-9a-zA-Z]
\W 匹配任意一个非普通字符 等同于 [^_0-9a-zA-Z]
示例:
\w示例
re.findall('\w+','hello_1')
['hello_1']
re.findall('\w+','hello&1')
['hello', '1']
\W示例
re.findall('\W+','hello&1')
['&']
15、匹配空字符/非空字符(空字符:[ \n\t\r]等)
元字符\s \S
匹配规则
\s 匹配任意空字符
\S 匹配任意非空字符
示例:
\s示例
re.findall('\s','hello world')
[' ']
re.findall('\s','hello world\r\n\t')
[' ', '\r', '\n', '\t']
\S示例
re.findall('\S','hello world')
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
16、匹配起止位置
元字符\A \Z
匹配规则
\A 匹配开始位置 等同于^
\Z 匹配技术位置 等同于$
绝对匹配:
\Aabc\Z 只能匹配abc,且字符串只是abc
示例:
re.findall('\A/\w+/\w+/Z','/football/zhongchao')
['/football/zhongchao']
17、匹配单词边界位置/非单词边界位置
元字符\b \B
匹配规则:
\b 匹配单词的边界
\B 匹配非单词的边界
单词边界:
数字字母下划线和其他字符的交界位置为单词的边界
示例:
re.findall(r'\bis\b','This is a test')
['is']
re.findall('\\bis\\b','This is a test')
['is']
re.findall('\Bis\\b','This is a test')
['is']
8、元字符总结:
1、匹配单个字符: a(普通字符) . \d \D \w \W \s \S [...] [^...]2、匹配重复性: * + ? {n} {m,n}
3、匹配某个位置: ^ $ \A \Z \b \B
4、其他: | () \
9、转义字符
正则表达式特殊符号:. * + ? ^ $ '' "" [] {} ()
如果想匹配特殊符号则加转义
或
r+字符串:
r表示原生字符串
示例:
re.findall('\\bis','this is')
['is']
或
re.findall(r'\bis','this is')
['is']
10、贪婪和非贪婪
贪婪模式:正则表达式默认的重复匹配模式:贪婪模式
尽可能多的向后匹配
在 * + ? {m,n} 这四种情况下会产生贪婪模式
非贪婪模式(后加?)
尽可能少的匹配内容,满足正则表达式含义即可
贪婪转为非贪婪:*? +? ?? {m,n}?
示例:
re.findall('ab*?',''abbbbbbbcd)
[ab]
11、正则表达式分组(子组)
使用()可以为一个正则表达式建立一个子组,子组可以看做内部的整体1、子组的作用
1、增加子组后多正则表达式的整体匹配内容没有影响
2、子组可以改变重复元字符的重复行为
3、子组在某些操作中可以对子组匹配内容单独提取
2、子组使用的注意事项:
1、每个正则表达式可以有多个子组,由外到内,由左到右为第一第二……子组
2、子组通常不要交叉
3、捕获组和非捕获组(命名组和非命名组)
子组命名格式
(?P<name>正则表达式) name就是名字
命名的优点:
1、很多编程接口可以直接通过名字获取子组匹配内容
2、捕获组中的正则表达式可以通过名字重复调用
重复调用的方法:
(?P=name)
示例:
(?P<dog>ab)cdef(?P=dog) 匹配:abcdefab
re.search('(ab)+','abababab').group()
'abababab'
re.search('(?P<dog>ab)cdef(?P=dog)','abcdefabcde').group()
'abcdefab'
12、re模块
1、obj=compile(pattern,flags = 0)
功能:获取正则表达式对象
参数:
pattern 正则表达式
flags 功能标志位,提供更丰富的匹配
返回值:
正则表达式对象
2、re模块和compile对象均有的函数
1、obj.findall(string, pos, endpos)
功能:通过正则表达式匹配字符串
参数:
string : 目标字符串
pos : 目标字符串的匹配开始位置
endpos : 目标字符串的结束位置
返回值:
匹配到的所有内容以列表返回
注:
如果正则表达式有子组则只显示字符匹配内容
2、obj.split(string)
功能:按照正则表达式切割目标字符串
参数:
目标字符串
返回值:
切割后的内容,列表形式
3、obj.sub(replaceString,string,max)
功能:替换正则表达式匹配到的内容
参数:
replaceString 要替换的内容
string 目标字符串
max 最多替换几处
返回值:
返回替换后的字符串
4、obj.subn(replaceString,string,max)
功能:替换正则表达式匹配到的内容
参数:
replaceString 要替换的内容
string 目标字符串
max 最多替换几处
返回值:
返回替换后的字符串和实际替换的个数,元组格式
5、re.finditer(string)
功能:使用正则表达式匹配目标内容
参数:
目标字符串
返回值
迭代对象,迭代的每个内容为一个match对象
6、re.match(pattern,string)
功能:匹配一个字符串的开头
参数:
string : 目标字符串
返回值:
如果匹配到返回 match obj
没有匹配到返回 None
7、re.search(pattern,string)
功能:匹配一个字符串
参数:
string : 目标字符串
返回值:
如果匹配到返回 match obj
没有匹配到返回 None
注:match 只能匹配字符串的开头位置,search可以匹配任意位置,但是也只能匹配一处
通常match对象调用其属性时往往需要try异常处理
8、fullmatch()
要求目标字符串完全匹配3、compile对象特有的属性(re模块没有)
1、flags 标志位2、pattern 正则表达式
3、groupindex 捕获组形成的字典
4、groups 多少个子组
13、match对象属性方法
属性:
pos 目标字符串开头位置endpos 目标字符串结束位置
re 正则表达式对象
string 目标字符串
lastgroup 最后一组的名字
lastindex 最后一组是第几组
方法:
end() 匹配到内容的开始位置start() 匹配到内容的结束位置
span() 匹配到内容的起止位置,元组格式
group()
功能:
获取match对象匹配的内容
参数:
默认为0,表示获取正则整体的匹配内容
如果传入大于0的正数,表示获取对应子组匹配内容
返回值:
返回匹配的内容
groups()
功能:
得到所有子组匹配的内容,元组格式
groupdict()
功能:
得到所有捕获组匹配的内容,字典格式
14、flags参数:
compile findall search match finditer fullmacth sub subn split 都有flags参数作用:
辅助正则表达式,丰富匹配结果
参数选项
1、A 或 ASCII
作用:匹配ASCII码
2、S 或 DOTALL
作用:对元字符起作用,可以匹配换行符
3、I 或 IGNORECASE
作用:匹配大小写
4、M 或 MULTILINE
作用:对元字符 ^ $ 起作用,可以匹配每一行的开头结尾位置
5、X 或
作用:为正则添加注释
多个flags同时使用
使用 | 分隔如 re.I | re.X