re模块概述
import re
re.match re.seach re.findall
# pip 包管理工具
"""
re.match函数
原型:match(pattern, string, flags=0)
参数:
patter:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,值如下
re.I 忽略大小写
re.L 做本地化识别
re.M 多行匹配,影响^和$
re.S 识.匹配包括换行符在内的所有字符
re.U 根据Unicode字符集解析字符,影响 \w \ W \b \B
re.X s使我们以更灵活的格式理解正则表达式
功能:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回None
"""
# www.baidu.com 查找www
print(re.match('www', 'www.baidu.com ').span()) # .span 打印的是字符串所在的位置
print(re.match('www', 'ww.baidu.com ')) # 打印www
print(re.match('www', 'baidu.wwwcom ')) # 从起始位置开始匹配,只打印第一个www
print(re.match('wwW', 'www.baidu.com ')) # 返回None 区分大小写,未匹配到字符
print(re.match('wwW', 'www.baidu.com ', flags=re.I)) # 返回wwW (flags=re.I) 不区分大小写
# 扫描整个字符串,返回从起始位置成功的匹配
print('-----------------------------------')
'''
re.search函数
原型:search(pattern, string,flags=0)
参数:
patter:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
功能:扫描整个字符串,并返回第一个匹配成功的
'''
print(re.search('sunck', 'good man is sunck!sunck is nice'))# 返回第一个匹配成功的,不用从起始位置开始匹配
'''
re.findall
原型:search(pattern, string,flags=0)
参数:
patter:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
功能:扫描整个字符串,并返回结果列表
'''
print(re.findall('sunck', 'good man is sunck!sunck is nice')) # 返回2个sunck
正则表达式的元字符
import re
(pattern, string, flags=0)
print('-------匹配单个字符串--------')
只会匹配第一个字符
r'''
. 匹配除换行符以外的任意字符
[0123456789] []是字符集合,表示匹配方括号中所包含的任意一个字符
[sunck] 匹配's','u','n',c','k' 中任意一个字符
[a-z] 匹配任意小写字母
[A-Z] 匹配任意大写字母
[0-9] 匹配任意数字
[0-9a-zA-Z] 匹配任意的数字和字母
[0-9a-zA-Z_] 匹配任意的数字,字母和下划线
[^sunck] 匹配除了sunck这几个字符以外的所有字符,中括号里的^号称为脱字符,表示不匹配集合 中的字符
[^0-9] 匹配所有的非数字字符
\d 匹配数字,效果同[0-9]
\D 匹配非数字字符,效果同[^0-9]
\w 匹配数字,字母和下划线,效果同[0-9a-zA-Z_]
\W 匹配非数字,字母和下划线,效果同[^0-9a-zA-Z_]
\s 匹配任意的空白字符(空格,换行,换页,制表,回车)效果同[ \f\n\r\t]
\S 匹配任意非空白符,效果同[^ \f\n\r\t]
'''
print(re.search('.', 'i am a good boy')) # 打印i i为任意字符
print(re.search('[0123456789]', 'i am a good boy 5')) # 打印5 匹配0-9中的任意数字
print(re.findall('[^boy]', 'i am a good boy 5')) # 打印i a m等等 打印除boy以外的所有字符
print(re.findall('\d', 'i a3m a goo4d boy 5')) # 打印3,4,5 打印所有数字
print('-----------锚字符(边界字符)-------------')
'''
^ 行首匹配,和在[]里的^不是一个意思,会匹配每一行的行首
$ 行尾匹配
\A 匹配字符串开始,它和^区别是\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配他行的行首
\Z 匹配字符串结束,它和$区别是\A只匹配整个字符串的结束,即使在re.M模式下也不会匹配他行的行尾
\b 匹配一个单词的边界,也就是值单词和空格间的位置
'er\b'可以匹配never,因为er为这个单词的边界,不能匹配nerve,因为er不是这个单词的边界
\B 匹配非单词边界
'er\B'可以匹配nerve,因为er非这个单词的边界,不能匹配never,因为er是这个单词的边界
'''
print(re.search('xh$', 'xh is a good boy')) # 结尾不是xh 打印none
print(re.search('boy$', 'xh is a good boy')) # 结尾为boy 打印boy
print(re.search('^xh', 'xh is a good boy')) # 以xh开头 打印xh
print(re.findall('^xh', 'xh is a good boy\nxh is cool', re.M)) # 会打印2个xh 因为2个xh都是行首 re.M为多行匹 配
print(re.findall('\Axh', 'xh is a good boy\nxh is cool', re.M)) # 只会打印一个xh \A 代表匹配整个字符串开头
print(re.search(r'er\b', 'never')) # 打印er 因为er为这个单词的边界 r为取消转义字符
print(re.search(r'er\b', 'nerve')) # 打印None 因为er非这个单词的边界
print(re.search(r'er\B', 'never')) # 打印None 因为er为这个单词的边界
print(re.search(r'er\B', 'nerve')) # 打印er 因为er非这个单词的边界
print('-------匹配多个字符-------')
'''
说明:下方的x,y,z均为假设的普通字符(n,m)为非负整数,不是正则表达式的元字符
(xyz) 匹配小括号内的xyz(作为一个整体去匹配)
x? 匹配0个或者1个x
x* 匹配0个或者任意多个x
x+ 匹配至少一个x
x{n} 匹配确定的n个x (n为一个非负整数)
x{n,} 匹配至少n个x
x{n,m} 匹配至少n个最多m个x 注意n<=m
x|y 匹配的x或y
'''
print(re.findall('(xh)', 'xh is a good boy and xh is so cool')) #匹配到2个xh 均为整体['xh', 'xh']
print(re.findall('[xh]', 'xh is a good boy and xh is so cool')) #匹配到4个字符 ['x', 'h', 'x', 'h']
print(re.findall('a?', 'aaa')) # 打印0个或者1个a,['a', 'a', 'a', '']
print(re.findall('a*', 'aaa')) # 打印0个或者多个a,['aaa', '']
print(re.findall('a*', 'aaavdaa')) # 打印0个或者多个a,['aaa', '', '', 'aa', '']
print(re.findall('.*', 'aaavdaa')) #打印0个或者任意个字符 ,['aaavdaa', '']
print(re.findall('a+', 'aaavdaa')) # 打印至少一个a ,['aaa', 'aa'] 不会去匹配空字符
print(re.findall('a{3}', 'aaavdaatjeaaaa')) # 打印3个a字符 ['aaa', 'aaa']
print(re.findall('a{2,}', 'aaavdaatjeaaaawa')) # 打印至少为2个以上的字符['aaa', 'aa', 'aaaa']
print(re.findall('a{2,4}', 'vdaatjeaaaawaaaveuogbaaafresfa')) # 打印至少2个最多4个a字符['aa', 'aaaa', 'aaa', 'aaa']
print(re.findall(r'((s|S)unck)', 'sunck--Sunck---Sundf')) 打印S或者s开头的sunck单词 #[('sunck', 's'), ('Sunck', 'S')]
print('---------------特殊----------------')
'''
*? +? (xyz)? 表示最小匹配 通常都是尽可能多的匹配,可以使用这种解决贪婪匹配
(?:x) 类似(xyz),但它不表示一个组
'''
# 提取sunck********man,
str ='sunck is a good man!sunck is a nice man!sunck is a very handsome man'
print(re.findall(r'sunck.*?man', str))
<<<['sunck is a good man', 'sunck is a nice man', 'sunck is a very handsome man']
# 注释:/* part1 */ /* part2 */
print(re.findall(r'//*.*?/*/', r' /* part1 */ /* part2 */'))
<<<['/* part1 */', '/* part2 */']
'''
切割字符
'''
str1 ='i am a good boy'
print(str1.split(' ')) # 以空格作为切割符,多个空格连接在一起时无法使用
print(re.split(r' +', str1)) # 以至少一个空格作为切割符
"""
字符串的替换和修改
sub(pattern,repl,string,count=0,flags=0)
subn(pattern,repl,string,count=0,flags=0)
pattern: 正则表达式
repl: 指定的用来替换的字符串
string: 目标字符串
count:最多替换次数
功能:在目标字符串中以正则表达式的规则匹配字符串,再把他们替换成指定的字符串。可以指定替换的次数,如果不指定,会替换所有的匹配字符串。
区别:前者返回一个被替换的字符串,后者返回一个元组,第一个元素被替换的字符串,第二个元素表示被替换的次数
"""
str1 ='xh is a good boy'
print(re.sub(r'(good)', 'nice', str1)) # 打印的类型为str <<<xh is a nice boy
print(re.subn(r'(good)', 'nice', str1)) # 打印的类型为tuple,并会告知修改了多少次 <<<('xh is a nice boy', 1)