Python 正则表达式 (python网络爬虫)
昨天 2018 年 01 月 31 日,农历腊月十五日。20:00 左右,152 年一遇的月全食、血月、蓝月将今晚呈现空中,虽然没有看到蓝月亮,血月、月全食也是勉强可以了,还是可以想像一下一瓶蓝月亮洗衣液悬于空上,耳边是"大家好,我是渣渣灰,给大家推荐一款好玩的游戏--贪玩蓝月......" 22:00左右的样子,月亮已经出来了,坐下来写写博客啦。
对计算机程序员而言,要问当下前沿什么方向最流行?我想在大数据、云计算、人工智能这些方向中,目前位于翘楚的就是大AL(人工智能了),一种产品的流行总是会带动其依赖品的流行。说的就是 Python 语言,近几年的势头Python越Java座于编程语言首位。Python流行不仅是因为人工智能机器学习的支持,其自身也是有原因的,Python语言学习起来很容易、易懂,这不小学课堂都开Python课了么。Python又被称为"胶水语言",与其它的语言的兼容性很好。这也让不少程序员转向了Python,更何况当前的人工智能时代即将来临。
我最近也在学习Python,说到学习Python极大可能会接触到 爬虫 。关于爬虫,通俗说就是抓取网上数据的机器。涉及到爬虫,就与本文的点 正则表达式 就是分不开了。
正则表达式:又称为规则表达式,百度百科解释其为通常被用来检索、替换那些符合某个模式(规则)的文本。这就有点像那些暴力破解密码的软件,通过字典一个个组合进行破解。这也是挺考验计算机运算能力的.
关于Python正则表达式的知识,我也是从视频中学习来的。不知道全面否,大家可以进行评论补充。
正则表达式有以下特殊字符:
1) ^ . $ * ? + {2} {2, } {2, 5}
2) [] [^] [a-z] | ()
3) \s \S \w \W
4) [\u4E00-\u9FA5] \d
我将对每个符号进行讲解,并举以实例。
打开 Eclipse+Pydev、Pycharm 等可以写Python的IDE(集成开发环境),本人就以 Eclipse+Pydev 配置为例。
Eclipse 是Java的IDE,功能很强大,安装好 Pydev 就可以愉快地写python。所以学习使用Eclipse是不错的选择,如果你写 java 又写 python 的话,当然你安装个 CDT 就可以写 c/c++ 了。
安装 Eclipse:
首先要安装配置 JDK 环境,去 Oracle(甲骨文)官网下载 JDK 。 http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html
然后下载 Eclipse 安装。 https://www.eclipse.org/downloads/
再下载 Python 安装配置 Python 环境(python 2 \ python 3 看个人需求了)。 https://www.python.org/
打开 Eclipse , Help > Install New Software 在后边的文本框中填入 http://pydev.org/updates 然后点击 Add... 随便取个名,然后确定下边的方框应该就有 PyDev 和 PyDev Mylyn Integration (optional) 两项,第一项必选啦,第二项看你心情吧。然后 Next 什么的安装吧。
安装好了之后就会提示重启 Eclipse ,配置 pydev 了,这时 Windows > Preferences 中右栏就多出了个 PyDev 选项,展开其下的 Interpreters > Python Interpreter 配置 Python 环境。可以点击右侧的 Quick Auto-Config 快速自动配置,笔者安装了 Python 2 和 Python 3 两种版本。一般点击这个按钮只能配置好 Python 2,而 Python 3 就需要手动去 New 配置了。Python 3 默认安装位置在 C:\Windows 下,如果你更改了安装位置请自行找到对应的目录。
点击上方对应的 Python ,下方就会显示对应的已安装的软件包,右侧的 Install/Uninstall with pip 就可以安装软件包,像做爬虫时用到的 BeautifulSoup 就可以在些进行安装,在框中输入 -m pip install beautifulsoup 点击后边的 Run 就可以搜索并安装了,不管安装成功与否都会有说明的(这些简单的英语,自行翻译一下就可以了)。
然后就可以写 Python 了,File > New > Projects 选择 PyDev > PyDevProject 新建 PyDev Package 在 __init__.py 就可以写 python 了。
首先在编辑框中写入
#coding:utf-8
import re
声明一下编码 UTF-8 不然有打印中文时会报错
导入正则表达式模块
1). ^ 表示必须以特定的字符开头 如 ^e 则是表示待匹配字符串必须以 e 字符开头
$ 表示必须以特定的字符结尾 与 ^ 恰恰相反字符放置也是相反 如 $e 则是表示待匹配字符串必须以 e 字符结尾
. 表示任意字符 匹配任意字符 表示在待匹配字符串指定位置可以出现任意字符
* 表示指定字符可以出现任意次 (n >= 0) 如 e* 表达在待匹配字符串中指定位置可以出现任意次数
就 ^ $ . * 举个粟子吧(match 函数从首字母开始开始匹配,regex_str如果包含line子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,line要以$结尾)
#coding:utf-8
import re
#导入正则表达式模块
line = "Hello World"
#待匹配字符串
regex_str = "(^H.*d$)"
if re.match(regex_str, line):
# match 函数 (传入的参数,要匹配的字符串)
# 从首字母开始开始匹配,regex_str如果包含line子串,则匹配成功,
# 返回Match对象,失败则返回None,若要完全匹配,line要以$结尾。
print 'True'
else:
print 'False'
运行结果 True 说明匹配成功,^H 以 H 字符开头 、 .* 任意字符出现任意次、d$以 d 字符结尾,以上都满足故 True .
? 非贪婪匹配,在正则表达式中匹配是贪婪的,程序会尽可能匹配更多的字符,当然这有时候非我们所愿.为了防止其贪婪匹配,于是 ? 就派上用场了。(group()用来提出分组截获的字符串,()用来分组)
#coding:utf-8
import re
#导入正则表达式模块
line = "heedeeehhlhloooooooo world"
regex_str = ".*(h.*h).*"
match_obj = re.match(regex_str, line)
if match_obj:
print (match_obj.group(1))
#group()用来提出分组截获的字符串,()用来分组
#结果中本来 'heedeeeh' 'hh' 'hhlh' 都是满足条件的
#但由于贪婪匹配,尽可能匹配更多的的后面的字符,
#这就匹配到最后一个满足条件的 'hlh'
运行结果为: hlh ,那么问题来了 heedeeeh hh hhlh hlh 这样也满足条件同时也先出现,那为什么提取的是 hlh 呢? 原来程序是贪婪匹配的的,程序想尽多可能匹配后面更多的然后就像猴子捡了芝麻丢了西瓜,最后就提取出最后一个符合条件的 hlh ,我们也可以这样理解贪婪匹配就是反向(从右往左)进行匹配,匹配到的第一项就是贪婪的结果了。
防止贪婪你可以在之前加上 ? 这样满足么?来看看
#coding:utf-8
import re
#导入正则表达式模块
line = "heedeeehhlhloooooooo world"
regex_str = ".*?(h.*h).*"
match_obj = re.match(regex_str, line)
if match_obj:
print (match_obj.group(1))
运行结果为 heedeeehhlh 好像不是所料到的结果吧,我只是提取个 heedeeeh 。为么呢,原来到上述一样你正向是非贪婪匹配了,而反向却没有,所以呢只需在后面也加上百贪婪匹配就行了(注意加在后面字符前边 即下代码中 h 前)。运行结果 heedeeeh 就对了。
#coding:utf-8
import re
#导入正则表达式模块
line = "heedeeehhlhloooooooo world"
regex_str = ".*?(h.*?h).*"
#注意 加在 h 之前
match_obj = re.match(regex_str, line)
if match_obj:
print (match_obj.group(1))
+ 表示指定字符至少出现一次及一次以上, h+ 就表示在待匹配字符串指定位置出现 h 至少一次以上
{2} 表示指定字符出现2次, h{2} 就表示在待匹配字符串中指定位置出现 h 两次
{2,} 表示指定字符至少出现2次及以上,(注意 , 后面不能留有空格) 数字不固定 如 h{3,} 表示待匹配字符串中指定位置出现3次以上
{2,6} 表示指定字符出现 2次-6次 之间, 如 h{3,5} 表示在字符串中指定位置出现次数在 3次-5次 之间
见代码 运行结果 heeh 其它就不演示了,差不多的
#coding:utf-8
import re
line = "heehhlhloooooooo world"
regex_str = ".*(he{2,}h).*"
match_obj = re.match(regex_str, line)
if match_obj:
print (match_obj.group(1))
2). [adbc] 表示在待匹配字符串中指定位置指定字符是 adbc 中任一个就满足条件
同时可以写成区间形式 如 [a-z] [0-9] 也可以区间叠加 如 [a-zA-z0-9]
[^h] 则表示待匹配字符串中指定位置指定字符非 h 就满足条件
注意: [.] [*] 此[]中的 . * 就不再表示任意字符和出现任意次数 这个就表示它们本身
看看粟子吧 运行结果为 hloooo0
#coding:utf-8
import re
line = "heehhlhloooo0 world"
regex_str = ".*(h[^e][a-z].*[0-9]).*"
match_obj = re.match(regex_str, line)
if match_obj:
print (match_obj.group(1))
| 就是或的关系,(h|r)表示待匹配字符串中指定位置只要出现 h 和 r 中的任一个就符合条件
() 在之前提到过,用来分组,在本实例中与之搭配用的group()就是用来提出分组截获的字符串 group(1) 就表示截获第1个分组的字符串 当然要有分组即需有 ()
实例
#coding:utf-8
import re
line = "hello365"
regex_str = "((hello|hell0o)365)"
match_obj = re.match(regex_str, line)
if match_obj:
print (match_obj.group(1))
print (match_obj.group(2))
运行分别输入结果 hello365 hello group(2)就截获第2个分组中的字符串 即 hello 或 hell0o 中一个
3). \s 表示待匹配字符串中指定位置指定字符为空格, 而 \S 则是表示非空格 同样的对单独使用只对指定的单个字符有效 若要多个则需加上 +
\w 表示待匹配字符串中指定位置指定字符为 a-z A-Z _ 等同于 [a-zA-Z0-9_], \W 则是除去这些字符的其它字符 像 ~ ! @ # $ % ^ & *
用实例说话
#coding:utf-8
import re
line = "hello world~"
regex_str = "(\wello\sworld\W)"
match_obj = re.match(regex_str, line)
if match_obj:
print (match_obj.group(1))
运行结果 hello world~ 对吧 没毛病
4). \d 表示待匹配字符串中指定位置为数字 [\u4E00-\u9FA5] 则是表示为中文
#coding:utf-8
import re
line = "hello world365嗨"
regex_str = "(hello\sworld\d+[\u4e00-\u9fa5]+)"
match_obj = re.match(regex_str, line)
if match_obj:
print (match_obj.group(1))
运行结果为 hello world365嗨
好,以上就是我学习Python 网络爬虫中重要的一节正则表达式,可能不是很全面,甚至还有点小问题,更多的可以去菜鸟教程等各大知名资料网查询。本人所写仅供参考。
Python 正则表达式 (python网络爬虫)的更多相关文章
- Python初学者之网络爬虫(二)
声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...
- [Python学习] 简单网络爬虫抓取博客文章及思想介绍
前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...
- Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...
- Python 利用Python编写简单网络爬虫实例2
利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...
- Python中的网络爬虫怎么用?
爬虫概述 (约2016年)网络爬虫个人使用和科研范畴基本不存在问题,但商业盈利范畴就要看对方了. 通过网站的Robots协议(爬虫协议)可以知道可以和不可以抓取的内容,其中User-Agent: 为允 ...
- Python 基础教程 —— 网络爬虫入门篇
前言 Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言,它由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年.自面世以后,Pytho ...
- 智普教育Python培训之Python开发视频教程网络爬虫实战项目
网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 01.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 02.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Pytho ...
- 从零开始学Python 三(网络爬虫)
本章由网络爬虫的编写来学习python.首先写几行代码抓取百度首页,提提精神,代码如下: import urllib.request file=urllib.request.urlopen(" ...
- 【Python开发】【神经网络与深度学习】如何利用Python写简单网络爬虫
平时没事喜欢看看freebuf的文章,今天在看文章的时候,无线网总是时断时续,于是自己心血来潮就动手写了这个网络爬虫,将页面保存下来方便查看 先分析网站内容,红色部分即是网站文章内容div,可以看 ...
随机推荐
- 【树链剖分】洛谷P3384树剖模板
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- PE格式详解讲解1
这篇文章主要转载自小甲鱼的加密解密部分,然后补充加上我自己的少许内容,原文地址–>传送门 下面的内容主要是围绕这个图来进行 MS-DOS头部 这个头部是为了兼容早期的DOS系统,PE文件的第一个 ...
- Django-环境搭建
django开发环境搭建 环境说明 python django mysql pymysql pycharm 安装过程 安装python3.6.3 64位下载地址: https://www.python ...
- Yii2基本概念之——属性(property)
学习任何一门学问,往往都是从起基本的概念学起.万丈高楼平地起,这些基本概念就是高楼的基石,必须做详尽的分析.我们知道,Yii2是一款脉络清晰的框架,理顺了基础的概念和基本功能,学习更高级和复杂的功能就 ...
- 开发中使用UEditor编辑器的注意事项
最近在一个刚结束的一个项目中使用到了UEditor编辑器,下面总结一下遇到的问题以及使用时需要注意的地方: 1. 使用UEditor插件需要先对其进行路径配置: 在ueditor.config.js文 ...
- Codefoces 723B Text Document Analysis
B. Text Document Analysis time limit per test:1 second memory limit per test:256 megabytes input:sta ...
- GDOI2016游记
翘课真好……(下午返校gg…… 为了GDOI,我特地准备了一堆模板,然后,由于在考前不久发现一个挺好玩的手游……模板就这么被放在一边(只翻了几次…… Day 0 同样是坐动车,到广州后转大巴到四会市, ...
- exit(0)与exit(1),return三者区别(详解)
exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数中,则会退出函数并返回一值. 详细说: 1. return返回函数值,是关键字 ...
- ACM_并查集
//题意:ignatius过生日,客人来到,他想知道他需要准备多少张桌子.然而一张桌子上面只能坐上相互熟悉的人, //其中熟悉可定义成为A与B认识,B与C认识,我们就说A,B,C相互熟悉 .例如A与B ...
- Shell菜单脚本
今天在这儿给大家分享一个我简单编写的Shell菜单脚本,傻瓜式的人机交互,人人都可以操作linux. #!/bin/sh #Shell菜单演示 function menu () { cat <& ...