主要内容:
1.可迭代对象和迭代器
from collections.abc import Iterable
#
# class Demo(object):
# pass
# d=Demo()
# print(isinstance(d,Iterable)) #False,判断这个实例对象是否为可迭代对象
# class Foo(object):
# def __next__(self):
# return '你好'
class Demo(object):
def __init__(self,x):
self.x=x
self.count=0
def __iter__(self): #只要重写了__iter__方法,就是一个可迭代对象
# f=Foo()
# return f
return self
def __next__(self):
self.count+=1
if self.count < self.x:
return '你好'
else:
raise StopIteration #让迭代器停止
d=Demo(10)
print(isinstance(d,Iterable)) #True
#for …… in ……循环的本质就是调用可迭代对象的__iter__方法,获取这个方法的返回值
#这个返回值需要的是一个迭代器对象,然后再调用这个对象的__next__方法
for i in d:
print(i)
2.导入模块
3.正则查找相关的方法
正则表达式:用来处理字符串,对字符串进行检索和替换
(1)match:查找字符串,返回的结果是一个re.Match对象
(2)search:查找字符串,返回的结果是一个re.Match对象
match和search:
1)共同点:只对字符串查询一次,返回值类型都是re.Match类型的对象
2)不同点:match是从头开始匹配,一旦匹配失败,就是返回None;search是对整个字符串查询
import re
m1=re.match(r'hello','helloworld')
print(m1) #<_sre.SRE_Match object; span=(0, 5), match='hello'>
m1=re.search(r'hello','helloworld')
print(m1) #<_sre.SRE_Match object; span=(0, 5), match='hello'>
m2=re.match(r'good','hello world,good morning')
print(m2) #None
m2=re.search(r'good','hello world,good morning')
print(m2) #<_sre.SRE_Match object; span=(12, 16), match='good'>
(3)finditer:找到所有的匹配数据并放到一个可迭代对象里面,返回的结果是一个可迭代对象,可迭代对象里的数据是匹配到的所有结果,是一个re.Match类型的对象
import re
from collections.abc import Iterable
m1=re.finditer(r'x','asfdxsgdhbxhihxas')
print(isinstance(m1,Iterable)) #True
print(m1) #<callable_iterator object at 0x0000025A53086CC0>
for i in m1:
print(i)
# <_sre.SRE_Match object; span=(4, 5), match='x'>
# <_sre.SRE_Match object; span=(10, 11), match='x'>
# <_sre.SRE_Match object; span=(14, 15), match='x'>
(4)findall:把查找到的所有字符串结果放到一个列表里
import re
m1=re.findall(r'x','asfdxsgdhbxhihxas')
print(m1) #['x', 'x', 'x']
m2=re.findall(r'x\d+','asfdx12sgdhbx89hihx28as')
print(m2) #['x12', 'x89', 'x28']
(5)fullmatch:完整匹配,字符串需要完全满足正则规则才会返回结果,否则返回的是None
import re
m1=re.fullmatch(r'hello','hello world')
print(m1) #None
m2=re.fullmatch(r'hello world','hello world')
print(m2) #<_sre.SRE_Match object; span=(0, 11), match='hello world'>
m3=re.fullmatch(r'h.*d','hjfhtesd')
print(m3) #<_sre.SRE_Match object; span=(0, 8), match='hjfhtesd'>
4.re.Match类的介绍
import re
# 调用re.Match、re.search或者对re.finditer结果进行遍历,拿到的结果都是re.Match类型的对象
m = re.search(r'm.*a', 'asfdmdgasdfasd')
print(m.pos, m.endpos) # 0 14 指定查找的范围
print(m.span()) # (4, 12) 匹配到的结果是字符串的开始和结束下标
print(m.group()) # mdgasdfa 获取匹配字符串的结果
# group可以传参,表示第n个分组
print(m.group(0))
'''
group方法表示正则表达式的分组
(1)在正则表达式里使用()表示一个分组
(2)如果没有分组,表示只有一组
(3)分组的下标从0开始
'''
# 这个正则表达式有四个分组
# group(0):(3.*)(4.*)(8.*1)
# group(1):(3.*)
# group(2):(4.*)
# group(3):(8.*1)
m1 = re.search(r'(3.*)(4.*)(8.*1)', 'asf3deat4gfvg8hfs1df')
print(m1.group(0)) # 3deat4gfvg8hfs1,m1.group()默认拿第0组
print(m1.group(1)) # 3deat
print(m1.group(2)) # 4gfvg
print(m1.group(3)) # 8hfs1
# ('3deat', '4gfvg', '8hfs1'),把分组的数据变成元组
print(m1.groups())
# groupdict 获取到分组组成的字典
print(m1.groupdict()) # {}
# 还可以个分组取个名字,格式:(?P<name>...)
m2 = re.search(r'(3.*)(?P<xxx>4.*)(8.*1)', 'asf3deat4gfvg8hfs1df')
print(m2.groupdict()) # {'xxx': '4gfvg'}
print(m2.groupdict('xxx')) # {'xxx': '4gfvg'}
print(m2.group('xxx')) # 4gfvg
print(m2.group(2)) # 4gfvg
print(m2.span(2)) # (8, 13)拿到第二组的下标
5.re.compile方法的使用
import re
#compile编译
#在re模块里可以使用re.方法调用函数,还可以使用re.compile得到一个对象
#可以直接调用re.search方法
m1=re.search(r'm.*a','qdqmwefgfdioyafrg')
print(m1.group()) #mwefgfdioya
r=re.compile(r'm.*a')
m1=r.search('qdqmwefgfdioyafrg')
print(m1.group()) #mwefgfdioya
6.正则修饰符的使用
import re
# 正则修饰符是对正则表达式进行修饰
# . 表示除了换行以外的任意字符
# re.S 让.匹配换行
# re.I 忽略大小写
# re.M 让$能够匹配到换行
m = re.search(r'm.*a', 'adfsmsc\nftsfadfss')
print(m) # None
m = re.search(r'm.*a', 'adfsmsc\nftsfadfss', re.S)
print(m.group())
# msc
# ftsfa
m = re.search(r'x', 'sdfXsd', re.I)
print(m.group()) # X
# \w:表示数字字母和_ +:出现一次以上 $:以指定的内容结尾
m = re.findall(r'\w+$', 'i am boy\nyou am girl\nhe is man', re.M)
print(m) # ['boy', 'girl', 'man']
7.正则匹配规则
import re
'''
(1)数字和字母都表示它本身
(2)很多字母前面添加\会有特殊含义(重点)
(3)绝大多数标点符号都有特殊含义(重点)
(4)如果想要使用标点符号,需要加\
'''
#w表示字母本身
m=re.search(r'w','hello world')
print(m.group())
#4表示数字本身
m=re.findall(r'4','3434652')
m1=re.search(r'\w','hello world') #\有特殊含义,不再是字母w
# m=re.search('+','1+2') #不能直接使用,+有特殊含义
m2=re.search('\+','1+2')
print(m2) #<_sre.SRE_Match object; span=(1, 2), match='+'>