Python--14、正则

Python–14、正则

re模块

findall 方法

​ Python中需要对正则表达式对字符串进行匹配的时候,可以使用一个模块来操作,名字叫re.

​ findall 方法:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回一个空列表。

​ res = re.findall(规则,被匹配的字符串) 有返回值(列表)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mf6ZfgM6-1580116288035)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200111163618608.png)]

s = "滑石粉看到啦谁的符任太帅师大费卡历史上4399"
# res = re.findall(规则,被匹配的字符串)    有返回值(列表)
res = re.findall("4399",s)
print(res)


['4399']

match方法

​ 从起始位置开始匹配。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42n9BHvF-1580116288036)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200111161933764.png)]

s = "滑石粉看到啦谁的符任太帅师大费卡历史上4399"

r1 = re.match("滑石粉",s)   #起始位置匹配,如果不是开头位置则什么也匹配不到
r2 = re.match("任太帅",s)

print(r1)   #正常返回
print(r2)   #因为不是开头位置,所以返回none
print(r1.group())   #match 内容
print(r1.span())   #span 索引区间

运行结果:
<_sre.SRE_Match object; span=(0, 3), match='滑石粉'>
None
滑石粉
(0, 3)

search方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YKRjwjEp-1580116288037)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200111162757444.png)]

s = "滑石粉任太帅看到啦谁的符任太帅师大费卡历史上4399"

r1 = re.search("任太帅",s)     #在整个字符串查找,找到之后就不找								了。只取一个值
print(r1)
print(r1.group())
print(r1.span())

运行结果:
<_sre.SRE_Match object; span=(3, 6), match='任太帅'>
任太帅
(3, 6)

4、三种方法进行对比:

s = "滑石粉任太帅看到啦谁的符任太帅师大费卡历史上4399"

print(re.findall("任太帅",s))      #返回所有的
print(re.match("任太帅",s))        #只能在开头寻找
print(re.search("任太帅",s))       #只会找第一个

运行结果:
['任太帅', '任太帅']
None
<_sre.SRE_Match object; span=(3, 6), match='任太帅'>

元字符

单字符匹配

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6wxlqySa-1580116288037)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200111163639729.png)]

res = re.findall(r"我.",s)        #一个点代表任意一个字符,可以多个点代表多个
res = re.findall(r"[go]",s)       #中括号选择列举的字符,只要在里面都可以找到
res = re.findall(r"\d",s)           #匹配所有数字,单个字符,单个的元素
res = re.findall(r"\D",s)          #匹配所有非数字
res = re.findall(r"\s",s)           #匹配所有空格
res = re.findall(r"\S",s)            #匹配所有非空格
res = re.findall(r"\w",s)             #匹配单词字符,包括汉字
res = re.findall(r"\W",s)               #匹配所有非单词字符
res = re.findall(r"\d\W",s)              #可以同时出现,但是需要同时满足条件

代表数量的元字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYdKwW7l-1580116288038)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200111165035146.png)]

s1 = "python good jon"

res = re.findall("o*",s1)   #匹配前一个字符出现0次或者无限次,有则返回改值,无则返回空
# 运行结果:['', '', '', '', 'o', '', '', '', 'oo', '', '', '', 'o', '', '']

res = re.findall('o+',s1)       #匹配前一个字符出现0次或者无限次,有返回值,至少出现一次.如果没找到则返回空值
# 运行结果:['o', 'oo', 'o']

res = re.findall('o?',s1)       #匹配前一个字符出现0次或者一次,有返回值。
# 运行结果:['', '', '', '', 'o', '', '', '', 'o', 'o', '', '', '', 'o', '', '']

res = re.findall('o{2}',s1)       #匹配前一个字符出现m次,有返回值
# # 运行结果:['oo']
#
res = re.findall('o{1,}',s1)       #匹配前一个字符至少出现m次,连续的字符
# # 运行结果:['o', 'oo', 'o']
#
res = re.findall('o{2,3}',s1)       #匹配前一个字符出现m到n次,连续的字符
# # 运行结果:['oo']


print(res)

代表边界的元字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-liN1FOaq-1580116288038)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200111170834936.png)]

s2 = 'hello world I am tom.'
s3 = ' hello 333  tom.'
s4 = 'i looooooooveeeeeeeve youw'
res = re.findall('^hell',s2)  # shift + 6
res = re.findall('^world',s2)  # 从开头字符查找
res = re.findall('tom.$',s2)# 从结尾字符查找
res = re.findall('^h.*?.$',s3)    #可以实现查找全部内容
res = re.findall(r'hello\b',s3)# 单词的边界--空格,如果hello后面接着另外的单词,他就会认为不是一个单词
res = re.findall(r'\blove\b',s4)# 单词的边界--空格
res = re.findall(r'love\B',s4)# 非单词的边界--空格,如果是变界则返回空值,否则返回值

分组匹配

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qq8s95BW-1580116288038)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200111172212478.png)]

"""title China is good."""
res = re.findall('[e]|[3]',s3)# 或
res = re.findall('i ([love]+) you',s4)# ()小括号,提取。需要满足外面的条件,然后提取中括号里面的内容

贪婪与非贪婪

​ 问号?是用来限制贪婪模式的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lfGJXRb-1580116288039)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200111175451321.png)]

s5 = """
<div>
<a target="_blank" href="http://sc.chinaz.com/tupian/191202279285.htm" alt="欧美生活美女写真图片"><img alt="欧美生活美女写真图片" src="http://pic1.sc.chinaz.com/Files/pic/pic9/201911/zzpic21240_s.jpg"></a>
</div>"""
s6 = "<html>0000000</html><h1>abcd</h1>"
res1 = re.findall('<.*>',s6)  # 贪婪匹配,找到最后一个括号才会结束
res2 = re.findall('<.*?>',s6)  # 非贪婪匹配,找到第一个就结束
print(res1)
print(res2)
res = re.findall(r'-(\d+)(.+-)','-159357852-')
# .+- 减号结尾前边是任意的字符
# -(\d+) 减号开头,后边拿最多的数字
res1 = re.findall(r'-(\d+?)(.+-)','-159357852-')
print(res)
print(res1)

rint(res2)
res = re.findall(r’-(\d+)(.±)’,’-159357852-’)

.± 减号结尾前边是任意的字符

-(\d+) 减号开头,后边拿最多的数字

res1 = re.findall(r’-(\d+?)(.±)’,’-159357852-’)
print(res)
print(res1)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值