1、为什么使用正则表达式?
最近在从事数据清洗的工作,对于很多的数据不能直接使用,所以前期的数据清洗非常有必要。为此首先就想到了正则表达式来进行部分数据的清洗操作。这也是在工作中使用非常常见的手段,所以今天简单记录一下。
2、使用需求
对于文本数据,按照行来进行清洗。由于一行数据中很有可以出现不合理的数据,比如本身是描述一段风景的中文文本,但是出现了部分英文字母甚至单词夹杂其中,所以需要去除多余的英文字母和单词。
特别的时候,并不需要将所有的不合理数据都去除,而是去除前面2个或者3个不合理数据即可。
3、过程分析
3.1、首先去除文本中所有不合理的数据,代码如下:
import re
str = "hi此撒还得华氏ci度武器心爱的hi无敌和湿地和"
print(re.sub(r'[a-zA-Z0-9]','',str)) # 至于sub的使用,完全可以参照其他资源
运行结果如下:
3.2、去除文本中指定次数的非法数据,这里认为连续字母作为1个单词,若去除2个非法数据,那么就是去除“hi”和“ci”。
由于compile的输出结果是供search和match使用的,而这两个都是从首位开始匹配,或者指定起始位置。显然在本案例中指定起始位置是不合理的。代码如下:
import re
str = "大大hi此撒还得23455华氏ci度武器心爱的hi无敌和湿地和"
pattern = re.compile(r'([a-zA-z]+)([^a-zA-z]+)([a-zA-z]+)')# 每个括号代表1个组
m = pattern.search(str)
print(m.group(0))# 表示所有组整体输出
# 每个组对应1个下标
print(m.group(1))
print(m.group(2))
print(m.group(3))
# 依次将前2次非法数据去除
str = re.sub(m.group(1),'',str,count=1)
str = re.sub(m.group(3),'',str,count=1)
print(str)# output: 大大此撒还得23455华氏度武器心爱的hi无敌和湿地和
输出结果:
部分解释:
- compile设置3个组的原因是因为search会顺序向后查找,所以两个单词之间可能存在其他文本,所以用3个组。
- sub部分分别对两个单词进行替换,从而完成去除任务。
4、结论
主要就是要理解compile分组的意思,对于分组后的结果应该如何理解,才能更好的利用search和match方法。
浅显记录一下,欢迎友友们的意见和建议。