一、re模块常用方法
compile(pattern, flags=0)
这个用法是re模块的工厂法,用于将字符串形式的正则表达式编译为Pattern模式对象,可以实现更加效率的匹配。第二个参数flag是匹配模式 使用compile()完成一次转换后,再次使用该匹配模式的时候就不能进行转换了。经过compile()转换的正则表达式对象也能使用普通的re用法。
flags参数
search(pattern, string, flags=0)
在文本内查找,返回第一个匹配到的字符串。它的返回值类型和使用方法与match()是一样的,唯一的区别就是查找的位置不用固定在文本的开头。
findall(pattern, string, flags=0)
作为re模块的三大搜索函数之一,findall()和match()、search()的不同之处在于,前两者都是单值匹配,找到一个就忽略后面,直接返回不再查找了。而findall是全文查找,它的返回值是一个匹配到的字符串的列表。这个列表没有group()方法,没有start、end、span,更不是一个匹配对象,仅仅是个列表!如果一项都没有匹配到那么返回一个空列表。
split(pattern, string, maxsplit=0, flags=0)
re模块的split()方法和字符串的split()方法很相似,都是利用特定的字符去分割字符串。但是re模块的split()可以使用正则表达式,因此更灵活,更强大。
split有个参数maxsplit,用于指定分割的次数。
sub(pattern, repl, string, count=0, flags=0)
sub()方法类似字符串的replace()方法,用指定的内容替换匹配到的字符,可以指定替换次数。
二、分组功能
Python的re模块有一个分组功能。所谓的分组就是去已经匹配到的内容再筛选出需要的内容,相当于二次过滤。实现分组靠圆括号(),而获取分组的内容靠的是group()、groups(),其实前面我们已经展示过。re模块里的几个重要方法在分组上,有不同的表现形式,需要区别对待。
例如:
import re
s = 'apple price is $66,banana price is $55'
# 需求是匹配 $66 $55
result = re.search(r'.+(\$\d+).+(\$\d+)',s)
print(result.group())
print(result.group(1))
print(result.group(2))
print(result.group(0))
print(result.groups())
结果:
group()/group(0) 匹配整个分组
group(1) 获取第一个分组
group(2) 获取第二个分组
groups() 获取所有的分组(把分组的结果放到了一个元组里面)
三、模块的读写
1 、通过writer对象的 writerow、writerows方法
import csv
headers = ('name','age','height') # 只要能够遍历就可以,比如迭代器、可迭代对象等
persons = [
('青崖',18,180),
('少年梦',28,185),
('红苹果',38,170)
]
with open('persons.csv','w',encoding='utf-8') as file_obj:
writer = csv.writer(file_obj)
writer.writerow(headers) #先把表头写进去
for data in persons:
writer.writerow(data)
结果:
import csv
headers = ('name','age','height') # 只要能够遍历就可以,比如迭代器、可迭代对象等
persons = [
('青崖',58,180),
('少年梦',28,185),
('红苹果',38,170)
]
with open('persons.csv','w',encoding='utf-8',newline='') as file_obj: #对比上面的结果可知,newline=''使得没有空行
writer = csv.writer(file_obj)
writer.writerow(headers)
writer.writerows(persons)
结果:
如果通过excel打开csv文件是乱码,那就要把excel的编码方式设置为utf-8
2、通过DictWriter对象
import csv
headers = ('name','age','height')
persons = [
{'name':'笔记本','age':18,'height':175},
{'name':'张同学', 'age': 18,'height':175},
{'name':'杨同学', 'age': 18,'height':175},
]
with open('persons.csv','w',encoding='utf-8',newline='') as file_obj:
Dwriter = csv.DictWriter(file_obj,headers)
Dwriter.writeheader()
Dwriter.writerows(persons)
结果:(有问题)
3、csv的读取
import csv
headers = ('name','age','height')
persons = [
{'name':'笔记本','age':18,'height':175},
{'name':'张同学', 'age': 18,'height':175},
{'name':'杨同学', 'age': 18,'height':175},
]
with open('persons.csv','w',encoding='utf-8',newline='') as file_obj:
Dwriter = csv.DictWriter(file_obj,headers)
Dwriter.writeheader()
Dwriter.writerows(persons)
with open('persons.csv','r',encoding='utf-8',newline='') as file_obj:
reader = csv.reader(file_obj)
for x in reader:
print(x)
结果:
import csv
headers = ('name','age','height')
persons = [
{'name':'笔记本','age':18,'height':175},
{'name':'张同学', 'age': 18,'height':175},
{'name':'杨同学', 'age': 18,'height':175},
]
with open('persons.csv','w',encoding='utf-8',newline='') as file_obj:
Dwriter = csv.DictWriter(file_obj,headers)
Dwriter.writeheader()
Dwriter.writerows(persons)
with open('persons.csv', 'r', encoding='utf-8', newline='') as file_obj:
Dreader = csv.DictReader(file_obj)
for x in Dreader:
print(x) #print(x['name'])
结果: