元字符
# . 匹配任意字符 换行符除外
# * 匹配前一个字符0次到多次
# + 匹配前一个字符1次到多次
# ? 匹配前一个字符0次到一次
# () ()中的字符作为一个整体,如(bo)?代表bo作为一个整体出现0次到一次
# {m,n} 匹配前一个字符m到n次,{m,}表示出现最少m次,{,n}表示最多出现n次
# \ 跟在其后的元字符变成普通字符,不在有其元字符的作用
# [] 字符集,一个字符的集合,可以匹配其中任意一个字符
# ^ 匹配每一行的开始位置,在[]中表示不匹配的意思如[^0-9]表示非数字
# $ 匹配每一行的结束位置,^和$和re.M一起用才能展示出效果,表示多行匹配
# \A 匹配开始位置
# \Z 匹配结束位置
# \b 匹配位于单词开始或者结束位置的空字符串
# \B 匹配不位于单词开始或者结束的空字符串
# \d 匹配一个数字[0-9]
# \D 匹配一个非数字[^0-9]
# \w 匹配数字,字母下划线中任意一个字符
# \W 匹配非数字字母下划线
\s 匹配任意的空白符(空格,回车,换行,制表,换页),效果同[ \r\n\t\f]
\S 匹配任意的非空白符,效果同[^ \f\n\r\t]
模式
主要有三种
re.M 多行匹配more
re.S 单选匹配表示 .可以匹配到任意字符
re.I 忽略大小写igronecase
干货在这里:
findall()
# findall()
import re
str1 = "abc,def,ghi"
rex = r"(a(\S*)i)"#此处的\S可以匹配任意非空白字符
pattern = re.compile(rex)
str_list = pattern.findall(str1)
# 输出为[('abc,def,ghi', 'bc,def,gh')]
# 由于我们在rex中写了两个小括号,findall()会返回小括号里面匹配的字符
# 例子中先是匹配了最外层的括号,匹配了里层的括号,而且将两个括号匹配上的加到同一个元组中返回
# 如果把外层括号去掉,将会直接返回['bc,def,gh']
print(str_list)
# findall()如果和小括号连用会导致findall()返回小括号里面的匹配上的内容
rex = r"\w+,\w+,\w+"
pattern = re.compile(rex)
str_list = pattern.findall(str1)
# 打印输出['abc,def,ghi']
print(str_list)
match()
import re
str1 = "aaa,def,ghi"
# {n,m},{m,},{,n},*,+,?优先匹配量词都是默认为贪婪模式
rex = r"a*?" # 在*后面加上了表示为非贪婪模式
rex1 = r"a*"# 默认为贪婪,会匹配上aaa
pattern = re.compile(rex)
pattern1 = re.compile(rex1)
# 注意match是从头开始和rex中的表达式匹配,只要有一个没有匹配上,就会返回None
print(pattern.match(str1))
print(pattern1.match(str1))
search()
import re
# search()只要在指定字符串中找到表达式对应的字符串就会返回
str1 = "abcdeddedde"
rex = r"de"
print(re.search(rex,str1))# 从字符串str1中找到de后返回
split()和sub()和subn()
re.split() # 正则表达式切割可指定切割次数
re.sub() # 替换返回一个新字符串可指定替换次数
re.subn() # 返回一个元组,含两个参数,一个是新字符串,一个是替换次数
多行匹配模式
# 如何匹配到多行的字符串[\u4e00-\u9fa5]汉字的范围
import re
# complie() 返回一个匹配模板如下所示,我们使用
pattern1 = re.compile(r"^[\u4e00-\u9fa5]+",re.M)
str1="""
12哈哈
呵呵
嘿嘿
"""
# 打印输出为['呵呵', '嘿嘿']
# 此处我们要注意的是re.M为多行匹配,常和^还有$一起用,可以匹配每一行的开头
# 一般我们使用findall来和re.M合用
print(re.findall(pattern1,str1))
子模式的使用
import re
#子模式用来简化正则表达式
pattern = re.compile(r"<([a-z]+)><(\w+)>\w+</\2></\1>")
ret = pattern.search("<div><span>hello</span></div>")
print(ret.group())# 输出为<div><span>hello</span></div>
#子模式访问
print(ret.group(1))# 输出为div表示(a-z)+匹配到的内容
print(ret.group(2))# 输出为span表示(\w+)匹配到的内容
拓展:零宽断言
# (?<!\d)表示目标字符前面是非数字
# (?<=\d)表示目标前面是数字
# (?!\d)表示目标后面不是数字
# (?=\d)表示目标后面是数字
import re
str1="12,23,4,5,52a32a,32a"
pattern1 = re.compile(r"(?<!\d)\d{2}(?!\d)")
print(pattern1.findall(str1))# ['12', '23', '52', '32', '32']