更多的表达式在这里有
https://blog.csdn.net/sj2050/article/details/81735549#%E6%A8%A1%E5%9D%97%E5%86%85%E5%AE%B9
原子
image.pngimport re#系统自带的 正则表达式需要这个模块
str="nihaowodepy"
#普通字符作为原子
pat="py"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(9, 11), match='py'> 没有是None
#非打印字符作为原子
#\n 换行符 \t 制表符
str="""nihaowodepy
yes"""
#r 为了防止\转义
pat=r"\n"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(11, 12), match='\n'>
#通用字符作为原子
#\w 匹配任意一个字母数字或下划线
#\W 匹配除字母数字或下划线 大写与小写相反
#\d 十进制数字
#\D 除十进制数字
#\s 空白字符
#\S 除空白字符
str="""nihaowodepy7837 3yes"""
pat=r"\d\d\d"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(11, 14), match='783'>
pat=r"\w\d\d\d"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(10, 14), match='y783'>
pat=r"\d\s\d"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(14, 17), match='7 3'>
#原子表 [xyz]他会在[]中任意选一个
str="""nihaowodepy7837 3yes"""
pat=r"niha[opq]"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(0, 5), match='nihao'>
#[^]除了里面的都可以匹配
pat=r"niha[^opq]"
rst=re.search(pat,str)
print(rst)#None
元字符
image.png
#元字符
#. 除换行符外任意一个字符
#^ (不在原子表里) 匹配开始位置
#$ 匹配结束位置
#* 前面原子重复出现 0次1次多次
#? 前面原子重复出现 0次或1次
#+ 前面原子重复出现 1次或多次
#{n} 前面原子 恰好 出现N次
#{n,} 前面原子至少N次
#{n,m} 前面原子至少N次,最多出现M次
str="""nihaowodepy7837 3yesssssss"""
pat=r"ni.ao"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(0, 5), match='nihao'>
#不在开始就匹配不出来
pat=r"^ihao"
rst=re.search(pat,str)
print(rst)#None
#不在末尾就匹配不出来
pat=r"y..$"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(17, 20), match='yes'>
pat=r"yes*"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(17, 26), match='yesssssss'>
pat=r"yes?"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(17, 20), match='yes'>
pat=r"yes+"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(17, 26), match='yesssssss'>
pat=r"yes{3}"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(17, 22), match='yesss'>
pat=r"yes{3,}"
rst=re.search(pat,str)
print(rst)#<_sre.SRE_Match object; span=(17, 26), match='yesssssss'>
#| 模式选择符或
#() 模式单元 就是把()里的当成一个原子
print(re.search(r'ab|cd','acdf'))
#<_sre.SRE_Match object; span=(1, 3), match='cd'>
print(re.search(r'(efg)','abcdefghj'))
#<_sre.SRE_Match object; span=(4, 7), match='efg'>
模式修正符
image.png#模式修正符
#I 匹配时忽略大小写 重点
#M 多行匹配 重点
#U Unicode 根据编码格式解析
#S 让.可以匹配到包括换行符 重点
print(re.search("pyt","Python",re.I))
#<_sre.SRE_Match object; span=(0, 3), match='Pyt'>
#换了行也能匹配到
print(re.search(r'^T','I love China\nT love Chian\nU love China',re.M))
#<_sre.SRE_Match object; span=(13, 14), match='T'>
print(re.search(r'.','\n',re.S))
#<_sre.SRE_Match object; span=(0, 1), match='\n'>
贪婪模式和懒惰模式
image.png#贪婪模式与懒惰模式
#贪婪模式 匹配直到出现y
print(re.search("p.*y","pythony"))
#<_sre.SRE_Match object; span=(0, 7), match='pythony'>
#懒惰模式 找到就停止 不继续贪 精准
print(re.search("p.*?y","pythony"))
#<_sre.SRE_Match object; span=(0, 2), match='py'>
正则表达式函数
为了实现功能匹配 用正则表达式必须用这个函数
image.png
#正则表达式函数
#match 只能从头开始匹配
print(re.match("o.*?y","pythony"))
#None
#search 之前讲的都是 任意位置匹配
#compile 全局匹配函数 满足格式都能出来
print(re.compile("o.*?y").findall("pythonyouyovy"))
#['ony', 'ouy', 'ovy']
#sub 替换
print(re.sub(r'hate','love','I hate China'))
#'I love China'
常见正则实例
image.png#实例 匹配.com .cn网址
#这个是html代码格式字符串
str="<a href='http://www.baidu.com'>百度首页</a>"
#从大小写a-z至少一次匹配到://处 然后再非空匹配N次到.com或.cn为止
print(re.compile(r'[a-zA-Z]+://[^\s]*[.com|.cn]').findall(str))
#['http://www.baidu.com']
#实例 匹配电话号码
#直辖市 区号三位数 后面有八位
#非直辖市 区号四位数 后面有七位
#总数是11位
str="abvfadvdav021-5648416841894185asdasdas0778-6544545838654sdfasdf"
print(re.compile(r'\d{3}-\d{8}|\d{4}-\d{7}').findall(str))
#['021-56484168', '0778-6544545']
网友评论