python正则表达式

元字符:描述其他字符的特殊字符。由基本元字符+普通字符组成

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:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值