1 通过python中re模块去学习并使用 正则表达式的基本知识点
#group(num) 可以获取匹配的数据 如果有多个匹配结果的话 那么会以元组的形式 存放到group对象中,
#此时我们可以通过下标去获取
import re
data='Python is the best language in the world'
result=re.match('Python',data)#精确匹配,只能匹配包含第一个字母的
print(type(result))#返回<class 're.Match'>
print(result.group())#利用group获取匹配的值
#通过python中re模块去学习并使用 正则表达式的常用匹配规则
import re
strData='Python is the best language in the world'
#match 只能匹配以xxx开头的子符串,第一个参数是正则,第二个参数是需要匹配的字符串
res=re.match('Python',strData,re.I)#re.I忽略大小写
res = re.match('(.*) is (.*?) .*',strData,re.I|re.M)
if res:
print('匹配成功...')
print(res)
print(res.groups())#以元祖形式返回所有的值
print(res.group(1))
print(res.group(2))
else:
print(res.group()) #如果匹配失败 是没有group函数的 因为是一个空对象None
# print(res)
print('匹配失败...')
2 常用的匹配规则
# . 点的使用 匹配规则是除了 换行符之外的字符
import re
# data='a1aaa'
# names='李达','李明','小王','小李'
# pattern='李.' #匹配规则
# parrtern='...'#匹配规则
# for name in names:
# res=re.match(pattern,name)
# if res:
# print(res.group())
# []中括号的使用 匹配规则是:匹配中括号中的任意一个字符
str1='eHello'
# str1='eee'
# res=re.match('[he]',str1)
# res=re.match('[He]',str1) #只能匹配单一字符
# print(res.group())
# pattern='[abc]' #使用中括号括起来的内容, 代表一个集合,代表匹配集合内的任意一个字符
# pattern='[a-z]' #可以简写一个范围abcdefg
# [abc]代表可以匹配a或者b或者c
# datas='a','b','c','e','wyw'
# for data in datas:
# result=re.match(pattern,data)
# if result:
# print('匹配成功 %s'%result.group())
#
# \d 匹配一个数字 0-9
# data='12345abcdef'
# print(re.match('\d\d\d',data).group())
# \D 匹配一个非数字
# data='W12345abcdef'
# print(re.match('\D',data).group())
# \s 匹配一个空白字符 或者tab键
# data=' hello'
# print(re.match('\s\s',data).group())
# \S 匹配非空白字符
# data='Pthon hello'
# print(re.match('\S\S\S\S\S',data).group())
# \w 匹配单词字符,即a-z、A-Z、0-9、_ 使用较频繁
# data='_2Yssdf'
# print(re.match('\w\w',data).group())
# \W 匹配非[a-z、A-Z]单词字符 使用较频繁
# data='@$# _2Yssdf'
# print(re.match('\W\W',data).group())
3 正则匹配数量
#正则===匹配
# * 匹配前一个字符出现0次或者无限次,即可有可无
import re
# res=re.match('[A-Z][A-Z]*','My')#匹配0次
# res=re.match('[A-Z][a-z]*','EnjoyLifeEnjoyLearning')#匹配了2次
# res=re.match('[A-Z][a-z]*','Enjoylifeenjoylearning')
# print(res.group())
# + 匹配前一个字符出现1次或者无限次,即至少有1次
# res=re.match('[a-zA-Z]+','SUNSHINElife')
# print(res.group())
# 匹配符合规范【规则是:不能以数字开头,只能包含字母、数字、下划线】的python变量命名
# result=re.match('[a-zA-Z_]+[\w]*','name')
# result=re.match('[a-zA-Z_]+[\w]*','_name')
# result=re.match('[a-zA-Z_]+[\w]*','na99m_e')
# print(result.group())
# ? 告诉引擎匹配前导字符 0 次或者一次,事实上表示前导字符是可以选择的
# result=re.match('[a-zA-Z]+[0-9]?','nameCloud99m_e')#可以匹配前面字符至少1次或者多次
# print(result.group())
# {min,max} 告诉引擎匹配前导字符min次到max次 ,min和max必须都是非负整数
# {count} 数字表示精确匹配的字符长度
# result=re.match('\d{4,}','123')
# result=re.match('\d{4,}','1234567890')
# {min,} 加逗号表示max被省略的话 表示max没有限制了
# result=re.match('\d{4,}','12342354235454623890')
# result=re.match('\d{4,8}','1234545363284972398')
# if result:
# print('匹配成功 {}'.format(result.group()))
# pass
# 匹配邮箱demo 格式xxxxxx@163.com
# regexMail=re.match('[a-zA-Z0-9]{8,11}@163.com','wana123uuu@163.com')
# if regexMail:
# print('匹配成功 {}'.format(regexMail.group()))
# pass
4 转义开头和结尾
# mypath = 'G:\\py资料\\1-上课资料\\4-正则表达式课件\\html'
# print(mypath) # 路劲输出异常
# print(re.match('c:\\\\a.txt','c:\\a.txt').group())
# print(re.match(r'c:\\a.txt','c:\\a.txt').group()) #在正则前面加r表示原生的字符串,python字符串就不转义
# ^ 匹配字符串的开头, . 表示一个或多个, *结尾
# result=re.match('^P.*','Python is langage')
# result=re.match('^P\w{5,}','Python is langage') # \w 提取字符
# if result:
# print(result.group())
# $ 匹配邮箱的结尾
# result=re.match('[\w]{5,15}@[\w]{2,5}.com$','myfunckmail@mail.comTest')
# if result:
# print(result.group())
# pass
#$匹配邮箱的结尾
# result=re.match('[\w]{5,15}@[\w]{2,3}.com$','accountlizzzz@qq.com')#@
# result=re.match('[\w]{5,15}@[\w]{2,3}.com$','accountlizzzz@163.com')#@
# if result:
# print(result.group())
5 分组匹配
#分组匹配
# | 竖线 匹配左右任意一个表达式 实际上是一个 或 的关系
import re
# string='wwwhhppptt6666'
# rs=re.match('(whhpp|wwwhhppptt666)',string)
# rs=re.match('(wwwhhppptt666|hhpp)',string)
# print(rs.group())
#(ab) 分组匹配 将括号中字符作为一个分组
# 匹配电话号码 xxxx-123456789
# res=re.match('([0-9]*)-(\d*)','0381-574892352')
# res=re.match('([^-]*)-(\d*)','0381-574892352') # ^ 有两种含义 1:以xxxx开头 2:否定 取反
# print(res.group())
# print(res.group(0))
# print(res.group(1))
# print(res.group(2))
#\num的使用 引用分组num匹配到的字符串
# htmlTag='<html><h1>测试数据</h1></html>'
# res=re.match(r'<(.+)><(.+)>(.+)</\2></\1>',htmlTag)#r原生,.任意, +多个; \2 表示前面第二组的匹配,\1前面第一组的匹配
# print(res.group())
# print(res.group(1))
# print(res.group(2))
# print(res.group(3))
# 分组 别名的使用 (?P<名字>) P必须大写
# 如何使用别名 (?P=引用的名字)
data='<div><h1>www.baidu.com</h1></div>'
# res=re.match(r'<(\w*)><(\w*)>(.*)<(/\w*)></\w*>',data)#\w任意字符,*多个
res=re.match(r'<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>',data)
print(res.group(0))