正则表达式的使用例子——实现简单的数据清洗
1.数据来源(这是我找的,其他来源也可,可跳过):
- 打开一个网页(b站什么的,推荐使chrome、edge浏览器,我使用的是edge):
- 找个空白处右键点击检查元素,然后就会变成下图:
- 点击显示代码那一侧的左上角的带有箭头的东西,然后就会发现在左边点击相应内容右边就会显示相应代码(我选中的是蓝色部分)
- 跳转到相应代码后ctrl+c复制,打开一个记事本或者sublime text等文件,粘贴
2.正文(数据清洗)
我希望把上述数据段简化成一段只有中文介绍的数据,不希望除中文外的东西出现。在介绍具体做法前,先来了解什么是正则表达式:https://blog.csdn.net/antony1776/article/details/83062899
简单来说,正则表达式就是一些用一些规则来表示字母,数字,符号。主要用来匹配类似的数据,具体来讲可分为:检查数据是否符合规范,例如注册邮箱的时候一定要多少位,账号第一位不能是什么;提取相似的大量信息,爬虫就是
我采用python来完成这件事
思路1:将中文剥离出来。那么使用re.findall(r"[\u4e00-\u9fa5]+", s)
In [1]: import re
In [2]:
...: s = '''<div class="job-detail">
...: <p><strong>我们需要你来:</strong></p>
...: <p>负责产品开发核心后台支持系统</p>
...: <p>负责产品架构、性能、安全、扩展等优化的设计和实现</p>
...: <p> </p>
...: <p><strong>我们希望你能:</strong></p>
...: <p>——拥有良好基础知识,熟悉常用算法和数据结构; </p>
...: <p>—— 两年以上python或Java等后端语言开发经验, 熟练掌握面向对象编程; </p>
...: <p>——具有技术钻研精神,追求完美,并具有较强自驱学习能力; </p>
...: <p>——熟练掌握MySQL数据库开发,熟悉SQL索引调优; </p>
...: <p>——熟悉tornado等框架,熟悉异步原理; </p>
...: <p>——对高负载、大访问量情况下的系统架构的搭建、调试、排错、优化、部署等方面有一定的经验;</p>
...: <p>——熟悉多种语言及流行技术,能够解决某种语言开发中遇到的问题优先; </p>
...: <p>——开源贡献者优先,github源码者优先,技术博客者优先。</p>
...:
...: </div>'''In [3]: re.findall(r"[\u4e00-\u9fa5]+", s)
Out[3]:
['我们需要你来',
'负责产品开发核心后台支持系统',
'负责产品架构',
'性能',
'安全',
'扩展等优化的设计和实现',
'我们希望你能',
'拥有良好基础知识',
'熟悉常用算法和数据结构',
'两年以上',
'或',
'等后端语言开发经验',
'熟练掌握面向对象编程',
'具有技术钻研精神',
'追求完美',
'并具有较强自驱学习能力',
'熟练掌握',
'数据库开发',
'熟悉',
'索引调优',
'熟悉',
'等框架',
'熟悉异步原理',
'对高负载',
'大访问量情况下的系统架构的搭建',
'调试',
'排错',
'优化',
'部署等方面有一定的经验',
'熟悉多种语言及流行技术',
'能够解决某种语言开发中遇到的问题优先',
'开源贡献者优先',
'源码者优先',
'技术博客者优先']
这种做法虽然能够提取所有的中文,但是改变了许多语句原来的意思。
思路二:删掉所有的英文及符号
import re
s = '''<div class="job-detail">
<p><strong>我们需要你来:</strong></p>
<p>负责产品开发核心后台支持系统</p>
<p>负责产品架构、性能、安全、扩展等优化的设计和实现</p>
<p> </p>
<p><strong>我们希望你能:</strong></p>
<p>——拥有良好基础知识,熟悉常用算法和数据结构; </p>
<p>—— 两年以上python或Java等后端语言开发经验, 熟练掌握面向对象编程; </p>
<p>——具有技术钻研精神,追求完美,并具有较强自驱学习能力; </p>
<p>——熟练掌握MySQL数据库开发,熟悉SQL索引调优; </p>
<p>——熟悉tornado等框架,熟悉异步原理; </p>
<p>——对高负载、大访问量情况下的系统架构的搭建、调试、排错、优化、部署等方面有一定的经验;</p>
<p>——熟悉多种语言及流行技术,能够解决某种语言开发中遇到的问题优先; </p>
<p>——开源贡献者优先,github源码者优先,技术博客者优先。</p>
</div>'''
def main():
ret = re.sub(r"<([a-zA-Z0-9]|\W)+>", '', s)
print(ret)
if __name__ == '__main__':
main()
虽然能够保证原来的意思,但是没用的内容却没有删干净,并且第一句和第二局之间少了间隔