一.正则表达式语法
二.例子
import re
#匹配a到c的字符
mc=re.match(r'[abc]','b') #mc.group()为b
print(mc.group())
mc=re.match(r'[abc]','abcd') #mc.group()为a
print(mc.group())
mc=re.match(r'[abc]','aeeee') #mc.group()为a
print(mc.group())
#匹配a到c的字符
mc=re.match(r'{[abc]}','{a}') #mc.group()为{a} {[abc]}的匹配字符串为"{c}"
print(mc.group())
#mc=re.match(r'{[abc]}','{ab}') #mc.group()为NoneType {[abc]}的匹配字符串为"{c}",{ab}是无法匹配的
#print(mc.group())
#mc=re.match(r'[abc]','d') #mc为nonetype
#print(mc.group())
#匹配a到z的字符
mc=re.match(r'[a-z]','aeeee') #mc.group()为a
print(mc.group())
#匹配A到Z的字符
mc=re.match(r'[A-Z]','Beeee') #mc.group()为B
print(mc.group())
#匹配a到z或者A-Z的字符
mc=re.match(r'[a-zA-Z]','beeee') #mc.group()为b
print(mc.group())
#匹配a到z或者A-Z或者0-9的字符
mc=re.match(r'[a-zA-Z0-9]','0eeee') #mc.group()为0
print(mc.group())
#\w/\W----匹配单词字符[a-zA-Z0-9]/非单词字符
mc=re.match(r'[\w]','beeee') #mc.group()为b
print("[\w]: "+mc.group())
#\w/\W----匹配单词字符[a-zA-Z0-9]/非单词字符
#\w----匹配单词字符[a-zA-Z0-9]
mc=re.match(r'{[\w]}','{b}') #mc.group()为{b}
print("{[\w]}: "+mc.group())
#mc=re.match(r'{[\w]}','{ }') #mc.group()为NoneType 因为空格为非单词字符
#print("空格: "+mc.group())
#\W----匹配非单词字符
mc=re.match(r'{[\W]}','{ }') #mc.group()为NoneType 因为空格为非单词字符
print("[\W]: "+mc.group())
#/d\/D 匹配数字/非数字
mc=re.match(r'{[\d]}','{1}') #mc.group()为NoneType 因为空格为非单词字符
print("[\d]: "+mc.group())
#/s\/S 匹配空白/非空白字符
mc=re.match(r'{[\S]}','{1}') #mc.group()为NoneType 因为空格为非单词字符
print("[\S]: "+mc.group())
#若想要匹配中国号[]的字符串
#错误写法
#mc=re.match(r'[[\d]]','[1]') #mc.group()为NoneType 因为加了中国号,可能会判断错误,所以我们需要转义
#print("[\d]: "+mc.group())
#正确写法
mc=re.match(r'\[[\d]\]','[1]') #mc.group()为NoneType
print("[\d]: "+mc.group())
#加上字符*表示匹配首字符0次或者无限次
ma=re.match(r'[A-Z][a-z]','Aa')
print(ma.group())
#应用:r'[A-Z][a-z]*'即表示匹配一个大写字母+0个或者无限个小写字母+字符串后缀
ma=re.match(r'[A-Z][a-z]*','A') #mc.group()为A
print(ma.group())
ma=re.match(r'[A-Z][a-z]*','AaaaB') #mc.group()为Aaaa
print(ma.group())
#前缀放进[]里面与放在外面的区别
ma=re.match(r'[1a-zA-Z]+[_\W]*','111_htll') #这个的值为111_
print(ma.group())
ma=re.match(r'1[a-zA-Z]+[_\W]*','111_htll') #这个无效
print(ma.group())
1.{m}/{m,n} 匹配前一个字符m次或者m到n次
2.*?/+?/?? 匹配模式变为非贪婪(尽可能少匹配字符)
#匹配数字0-99
ma=re.match(r'[1-9]?[0-9]','9') #前一个字符范围(1-9),该字符可出现0或1次,后一个字符范围(0-9)
print(ma.group())
#{m}/{m,n} 匹配前一个字符m次或者m到n次
ma=re.match(r'[a-zA-Z0-9]{6}','abc12333')
print(ma.group())
ma=re.match(r'[a-zA-Z0-9]{6,10}@163.com','abc123@163.com')
print(ma.group())
#*?/+?/?? 匹配模式变为非贪婪(尽可能少匹配字符)
ma=re.match(r'[0-9][a-z]*','1abc') #*为贪婪模式
print(ma.group()) #结果为1abc
ma=re.match(r'[0-9][a-z]*?','1aaa') #*为贪婪模式 *?前一个字符尽量匹配0次
print(ma.group()) #结果为1
ma=re.match(r'[0-9][a-z]+?','1aaa') #+?为贪婪模式 +?前一个字符尽量匹配1次
print(ma.group()) #结果为1a
ma=re.match(r'[0-9][a-z]??','1aaa') #??为贪婪模式 ??前一个字符尽量匹配0次
print(ma.group()) #结果为1
import re
#边界匹配
#字符^ 匹配字符串开头
ma=re.match(r'[\w]{5}@163.com','imooc@163.comabc')
print(ma.group()) #答案为imooc@163.com
ma=re.match(r'^[\w]{4,10}@163.com','imooc@163.com44') #进行全匹配
print(ma.group()) #答案为imooc@163.com
#字符$ 匹配字符串结尾
ma=re.match(r'^[\w]{4,10}@163.com$','imooc@163.com') #进行全匹配 (固定)指定字符串
print(ma.group()) #答案为imooc@163.com
#字符\A/\Z 指定的字符串必须出现在开头/结尾
ma=re.match(r'\Aimooc[\w]*','imoocpython')
print(ma.group()) #答案为imooc@163.com
import re
#正则表达式的分组匹配
#l 匹配左右任意一个表达式
ma=re.match(r'abc|d','abc')
print(ma.group())
ma=re.match(r'abc|d','d')
print(ma.group())
ma=re.match(r'abc|d','d')
print(ma.group())
#0-99
ma=re.match(r'[1-9]?\d$','99') #表示字符[1-9]可以出现0或1次,\d匹配数字 ,$以前面字符串结尾
print(ma.group()) #结果为99
ma=re.match(r'[1-9]?\d$|100','100') #表示字符[1-9]可以出现0或1次,\d匹配数字 ,$以前面字符串结尾
print(ma.group()) #结果为100
#(ab) 括号中表达式作为一个分组
ma=re.match(r'[\w]{4,6}@(163|126).com','imooc@126.com') #匹配一个163或126邮箱
print(ma.group())
#\<number> 引用编号为num的分组匹配到的字符串 ---判断xml的有效性
ma=re.match(r'<[\w]+>','<book>') #匹配一个<这里存在一个或多个字符>
print(ma.group()) #结果为<book>
ma=re.match(r'<([\w]+>)\1','<book>book>') #匹配一个<这里存在一个或多个字符>
print(ma.group()) #结果为<book>book>
ma=re.match(r'<([\w]+>)[\w]+</\1','<book>python</book>') #匹配一个有效的xml
print(ma.group()) #结果为<book>python</book>
#(?P<name>) 分组起一个别名 (?P=mark)引用前面的mark 类似于上面语句的\1
ma=re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>') #匹配一个有效的xml
print(ma.group()) #结果为<book>python</book>
#(?P=name) 引用别名为name的分组匹配字符串
ma=re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>') #匹配一个有效的xml
print(ma.group()) #结果为<book>python</book>
split(patter,string,maxsplit = 0,flags = 0) 根据匹配分割字符串,返回分割字符串组成的列表
#split(patter,string,maxsplit = 0,flags = 0) 根据匹配分割字符串,返回分割字符串组成的列表
#pattern,正则表达式 string被分割字符串 maxsplit分割次数
str4 = 'imooc:C C++ Java Python'
print(re.split(r':| ',str4)) #分割以:或者空格
str4 = 'imooc:C C++ Java Python,c#'
print(re.split(r':| |,',str4)) #分割以:或者空格或者,
sub(pattern,repl,string,count = 0,flags = 0) 将字符串中匹配正则表达式的部分替换为其他值
#sub(pattern,repl,string,count = 0,flags = 0) 将字符串中匹配正则表达式的部分替换为其他值
#pattern,正则表达式 repl函数或字符串 string被替换字符串
str3 = 'imooc videonum = 1000'
info = re.sub(r'\d+','1001',str3)
print(info)
#定义一个函数 repl为函数替换
def add1(match):
val = match.group()
num = int(val)+1
return str(num)
str3 = 'imooc videonum = 9999'
print(re.sub(r'\d+',add1,str3)) #结果为imooc videonum = 10000
search(patter,string,flags=0) 在一个字符串中查找匹配 使用正则表达式进行匹配
#search(patter,string,flags=0) 在一个字符串中查找匹配 使用正则表达式进行匹配
#查找字符串中的数字
str1='imooc videonum = 1000'
str1.find('1000') #返回的是索引
info = re.search(r'\d+',str1) #在字符串str1中查找数字
print(info.group())
findall(patter,string,flags=0) 找到匹配,返回所有匹配部分的列表
#findall(patter,string,flags=0) 找到匹配,返回所有匹配部分的列表
#获得字符串的所有数字
str2='c++=100,java=90,python=80'
info=re.findall(r'\d+',str2)
print(info)
print(sum([int(x) for x in info])) #获得字符串info的数字之和