元字符:描述其他字符的特殊字符。由基本元字符+普通字符组成
1.转义符:\
表示不是基本元字符,即字面意思
如:qq\.com 表示 . 不是转义符
2. ^开始 $ 结束
import re
#/w 代表任意字符 不包含空格
p1=r'\w+@qq\.com'
p2=r'^\w+@qq\.com$' #^表示已_开始 ,$以_结束
text="tim's email is tim_333@qq.com"
m=re.search(p1,text) #search(正则表达式,字符串)
print(m)
m=re.search(p2,text) #p2k开始字符串有空格,不匹配p2
print(m)
email='t2222Ztim_333@qq.com'
m2=re.search(p2,email)
print(m2)
输出:
字符类:用[]表示,放入想匹配的字符,若存在则匹配成功,每次只能匹配一个。
import re
p=r'[Jj]ava'
m1=re.search(p,'I like Java and Python')
m2=re.search(p,'i like java and python')
m3=re.search(p,'I like JAVA and Python')
print(m1)
print(m2)
print(m3)
结果:
字符类取反:使用^号
import re
p=r'[^0123456789]' #不要数字
m1=re.search(p,'1000')
m2=re.search(p,'python 3') #遇到第一个p就匹配
m3=re.search(p,'1000p')
print(m1)
print(m2)
print(m3)
结果:
区间:-表示 如[0-9] [1-32-7] [a-z] [A-Z]
import re
m1=re.search(r'[7-9]','1900')
m2=re.search(r'[o-z]','apython 3')
print(m1)
print(m2)
结果:
也可使用预定义字符表示:如/w
import re
m1 = re.search(r'\w', '1A900')
print(m1)
结果:
量词:
惰性量词:量词后加?,取最小值
分组:
()表示分组
import re
p=r'(\d{3,4})-(\d{7,8})' #()代表分组 ,分两个组
m1 = re.search(p, '0532-84586529')
print(m1)
print(m1.group()) #返回匹配的字符串
print(m1.group(1)) #使用编号访问分组,最小为1 ,返回第一个组匹配的内容
print(m1.groups()) #所有组匹配的内容
结果:
给分组命名:
小括号后加 ?P<名称>
import re
p=r'(?P<area1>\d{3,4})-(?P<area2>\d{7,8})' #()代表分组 ,分两个组
m1 = re.search(p, '0532-84586529')
print(m1)
print(m1.group(1)) #返回第一个组匹配的内容
print(m1.group(2))
print(m1.group('area1')) #通过组名引用
print(m1.group('area2'))
结果:
正则表达式内引用分组: 作用是保持前后一致
使用 \1 表示引用第一个分组的内容
import re
p=r'(\d{3,4})-\1' #\1 引用第一个分组的内容
m1 = re.search(p, '0532-0532')
print(m1)
print(m1.group(1))
结果:
非捕获:在组的开头加 ?:
import re
text=r'a1.jpg,a2.jpg,a3.bmp'
p='\w+(\.jpg)'
p2='\w+(?:\.jpg)' # ?;表示非捕获
m1 = re.findall(p, text)
m2 = re.findall(p2, text)
print(m1)
print(m2)
结果:
re模块:
search和match:
search 在字符中查找匹配的模块 match从头就开始判断是否符合正则表达式
import re
p1 = r'\w+@qq\.com'
text = "tim's email is tim_333@qq.com" #开始不匹配
m = re.search(p1, text)
print(m)
m = re.match(p1, text)
print(m)
email = 't2222Ztim_333@qq.com'
m2 = re.search(p1, email)
print(m2)
m2 = re.match(p1, email)
print(m2)
匹配的话返回的都是match对象
使用match对象
import re
p1 = r'\w+@qq\.com'
email = 't2222Ztim_333@qq.com'
m2 = re.match(p1, email)
print(m2)
print(m2.group()) #匹配对象
print(m2.start()) #开始索引
print(m2.end()) #结束索引
print(m2.span()) #跨度
findall ()和finditer():找出字符中所有符合的目标
finditer返回的是可迭代的match对象 可通过for循环取出match对象
import re
p=r'[Jj]ava'
text='i like Java and java'
m1=re.findall(p,text)
m2=re.finditer(p,text)
print(m1)
print(m2)
for i in m2:
print(i)
结果:
字符串分割:maxsplit 分割最大次数
import re
p=r'\d+'
text='sad1212aas12er'
m=re.split(p,text)
print(m)
结果:
字符串替换:
import re
#数字替换掉
p=r'\d'
text='sad1212aas12er'
m=re.sub(p,'*',text) #使用第二个参数替换
print(m)
结果:
编译正则表达式:运行速度提升
import re
#使用编译
p=r'\d'
regex=re.compile(p)
text='sad1212aas12er'
m=regex.match(text)
m2=regex.sub('!',text)
print(m,m2)
结果:
设置flag: