作者:稀饭
本文约 2000字 ,建议阅读 16分钟 。一、正则表达式
1、清洗手机号码
import re # 导入正则化模块
import numpy as np
import pandas as pd
# 清洗手机号码
s = ('13115021381','18277122391','17823912311','20218231923','138291229811') # 输出手机号码的数据,其中第4个数据不是手机号码(开头不是1)、第5个数据不是手机号码(有12位)
pattern = r'[1][35789]\d{9}$' # 设置正则化匹配的模式,手机号码是11位,第1位是1,第2位是35789中的一个,然后剩下9位数,用\d{9}来完成,最后用$表示结尾(即只匹配11个数)
a = [] # 设置空列表
for data in s: # 对列表中的元素进行遍历
if re.findall(pattern,data) != []: # 设定匹配的结果,不要空list
a.append(data) # 当不是空list的时候,向数组中添加元素
a # 查看清洗得到的结果,可以看到'20218231923'和'138291229811'这两个假手机号码被清洗掉了
![512265ce2d0c5659077f6ba9da605db3.png](https://i-blog.csdnimg.cn/blog_migrate/34891a484ae1bda585311108cf5fdde9.png)
2、清洗座机号码
s= ['010-28172132','0231-3817212','031-42312772','023-498281211','0131-39897123','0102321231'] # 输出座机号码,其中第4、6个数据不是座机号码
pattern = r'\d{2,3}-\d{7,8}$' # 座机号码的格式3或4数字-7或8数字
a = []
for data in s:
if re.findall(pattern,data) != []:
a.append(data)
a # 查看清洗得到的结果,可以看到最后第4个和第6个假座机号码已经被清洗掉了
![7ff82b0177d75e5105f4fe161ef82c39.png](https://i-blog.csdnimg.cn/blog_migrate/2ac140dba510474c554b221e25b8dbd5.png)
3、提取数据中出现“h”和“好”的数据,不区分大小写
s = ['Hi','好','human','真好吃'] # 设置模拟的数据
pattern_1 = r'h' # 设置匹配h的pattern
pattern_2 = r'好' # 设置匹配好的pattern,注意这里前缀必须加上r
a1 = []
a2 = [] # 设置两个空列表用来存数据
for data in s: # 使用循环来完成数据清洗
if re.findall(pattern_1,data,re.I) != []:
a1.append(data)
for data in s: # 使用循环来完成数据清洗
if re.findall(pattern_2,data,re.I) != []:
a2.append(data)
a1,a2 # 查看数据清洗的结果
![49b9d968c37ef780d56df31201f6d866.png](https://i-blog.csdnimg.cn/blog_migrate/e6f051ed2a875ded01b7735eb2a876a4.png)
4、提取数据集中包含“H2O”的数据
s = ['H2O','水H2O','过氧化氢H2O2','氢气H2'] # 设置模拟的数据
pattern = r'\w*H2O\w*' # 设置pattern的格式,在H2O的前后添加\w,然后使用*来表示查找任意数量的数据
a = []
for data in s: # 使用循环来完成数据清洗
if re.findall(pattern,data) != []:
a.append(data)
a # 查看最终的清洗结果
![e1d743eb1576787d7a6310fbdbb87bd8.png](https://i-blog.csdnimg.cn/blog_migrate/bf94ed192110ecee5267e5c4aad1684d.png)
5、提取QQ邮箱
s = ['182872@qq.com','1232@qq.com','12342@qq.com.cn','sAnBe2am@qq.com','sWM@qq.com'] # 设置模拟的数据,其中第2个、第3个和第5个数据都不是需要提取的数据
pattern = r'[a-zA-Z0-9]{5,}@qq.com$' # 设置提取的规则,设定是5个字符及以上@qq.com,其他都不是正确的QQ邮箱,其中[a-zA-Z0-9]表示既可以是大小写字母,也可以是数字
a = [] # 设置一个空列表
for data in s: # 使用循环来完成数据清洗
if re.findall(pattern,data) != []:
a.append(data)
a # 输出最后清洗得到的数据
![38057b710aa9b95b643bfe0713da18e4.png](https://i-blog.csdnimg.cn/blog_migrate/73c0905abea140aefbed8fb633f17e09.png)
6、清洗身份证号码
s = ['362301199608151016','36239818201'] # 设置身份证的测试数据,其中第2个数据有误pattern = r'^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$' # 设置18为身份证号的匹配规则,注意分前6位、年份、月份、天数、最后4位来分析a = []for data in s: # 使用循环来完成数据清洗 if re.findall(pattern,data) != []: a.append(data)a # 查看最终的清洗结果
二、格式化读写
1、读取数据
f_path = 'C:/Users/Lenovo/Desktop/1.txt' # 设定文件的路径
with open(f_path,'r') as f: # 使用with open的方式进行读,读的关键字为'r'
print(f.read()) # 查看数据的读取结果。另外注意使用with open语句的时候不需要close
![8e840ee249790855c56620e50defe775.png](https://i-blog.csdnimg.cn/blog_migrate/1f22012b366eff2b4c1bb2dd74a10441.png)
2、逐行读取数据并存入list列表中
f_path = 'C:/Users/Lenovo/Desktop/1.txt' # 设定文件的路径
dt = [] # 设置一个空的list,用于存放读取得到的数据
with open(f_path,'r') as f: # 使用with open的方式进行读,读的关键字为'r'
for line in f: # 使用for循环逐行读取数据
dt.append(line.rstrip()) # rstrip用于去除换行符号
print(dt) # 查看数据的结果
![399fd4a549a2d240bbd255f22ff6f3cc.png](https://i-blog.csdnimg.cn/blog_migrate/0b3a4b7a9aa89ec2520753fba6e67eef.jpeg)
3、将刚才得到的数据由字符串格式转为数值型格式,并去掉空格
dt2 = [] # 设置一个空列表,用于存储数据
print(dt) # 查看原始的数据情况
for data in dt:
dt2.append(list(map(float,data.split(' ')))) # 使用split函数按照空格进行字符串分割,再把结果传递给map函数用于数据类型转化,最后再list化
print(dt2) # 查看最后转化得到的数据情况
![cdaddab5a096a723ffc369184058deb4.png](https://i-blog.csdnimg.cn/blog_migrate/d42c3ddbc83ba3b7a868cd97c285272c.png)
4、写入一行数据(注意应该是追加写入,而不是覆盖),并在写的过程中比较写之前的数据情况和写之后的数据情况
f_path = 'C:/Users/Lenovo/Desktop/1.txt' # 设定文件的路径
with open(f_path,'a+') as f: # 使用with open的方式进行写,写的关键字为'w',但是这里要求不覆盖原始数据,所以要用'a+'来表示追加写
f.seek(0) # 将指针重置到开头位置(使用a+时,指针默认在尾部)
print(f.read()) # 查看写之前的数据情况
f.seek(2) # 将指针放回到尾部
f.write('\n4 3.2 2.8 1.9') # 写入数据,注意添加换行符
f.seek(0) # 将指针再次回到头部
print('\n') # 输出一个换行符,用于区分数据输出结果
print(f.read()) # 查看数据写入后的情况
![a793d040b32a5c3fa9939ea0c3924ab0.png](https://i-blog.csdnimg.cn/blog_migrate/bdbadbd285964c5f3bdacaf9b912c6b2.jpeg)