Python爬虫之正则表达式基本用法实例分析


Posted in Python onAugust 08, 2018

本文实例讲述了Python爬虫之正则表达式基本用法。分享给大家供大家参考,具体如下:

一、简介

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

二、使用方法

1、简单看一下写法

函数语法:

re.match(pattern, string, flags=0)

函数参数说明:

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.match方法返回一个匹配的对象,否则返回None

我们可以使用group(num)groups() 匹配对象函数来获取匹配表达式。

匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
import re
p = re.compile('abcd')
print(type(p))
#<class '_sre.SRE_Pattern'>
print(dir(p))
#['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn']
m = p.match('abcdef')
print(type(m))
#<class '_sre.SRE_Match'>
print(dir(m))
#['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string']
print(m.group())
#abcd
print(m.group(0))
#abcd

re.match()方法值匹配字符串的开头如果不满足,就返回一个None

import re
p = re.compile('abcd')
m = p.match('abdcef')
print(m.group())
#AttributeError: 'NoneType' object has no attribute 'group'

神奇的.

import re
p = re.compile('.')
m = p.match('abdcef')
print(m.group())
#a

特殊字符(元字符)

注意:\在里面是转义词的意思,例如,你想匹配一个re.compile('.'),这个.是匹配任意字符。但是我就想让它匹配一个.怎么办,re.compile('\.'),这样的话它就真的只匹配一个点。

Python爬虫之正则表达式基本用法实例分析

re.findall()

import re
p = re.compile('\.')
#匹配符号点(注意这里可前面加上了转义符\,就不是匹配任意字符了)
m = p.findall('abc.def.')
print(type(m))
#<class 'list'>
print(m)
#['.', '.']
#可以得出,返回的是一个list,全局查找,不想match方法只匹配字符串开头

数量词:

Python爬虫之正则表达式基本用法实例分析

贪婪模式和非贪婪模式

1、一个小例子

我们知道*表示匹配一个字符串0次或者多次,而+是匹配字符串1次或多次,所以*的时候匹配了0次也打印出来了,而+只找匹配1次的字符。

import re
p = re.compile('[abc]+')
m = p.findall('abcdef')
print(m)
#*
 #['abc', '', '', '', '']
#+
 #['abc']

贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配.

而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。

2、{}

根据下面的例子不难看出,数量词{m}表示的是匹配前面字符串的几个字符串

import re
p = re.compile('[abc]{3}')
m = p.findall('abcdabcd')
print(m)
#{1}
 #['a', 'b', 'c', 'a', 'b', 'c']
#{2}
 #['ab', 'ab']
#{3}
 #['abc', 'abc']

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配,否则返回的是None(注意findall返回的是list,而search返回的直接就是字符串)

import re
p = re.compile('abcd')
m = p.search('abcdabcd')
print(m.group())

检索和替换

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

示例一:

替换一#开头的所有字符(匹配任意字符0次或者多次),替换成无。

import re
phone = "2004-959-559 # 这是一个国外电话号码"
num = re.sub('#.*','',phone)
print(num)

示例一:扩展

找到所有非数字的字符,‘'代表着删除。

import re
phone = "2004-959-559 # 这是一个国外电话号码"
num = re.sub('\D','',phone)
print(num)

正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志

Python爬虫之正则表达式基本用法实例分析

Python 相关文章推荐
让 python 命令行也可以自动补全
Nov 30 Python
基于python元祖与字典与集合的粗浅认识
Aug 23 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 Python
python drf各类组件的用法和作用
Jan 12 Python
如何使用Python对NetCDF数据做空间相关分析
Apr 21 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 #Python
python MNIST手写识别数据调用API的方法
Aug 08 #Python
python实现屏保计时器的示例代码
Aug 08 #Python
详解Python 装饰器执行顺序迷思
Aug 08 #Python
python Flask 装饰器顺序问题解决
Aug 08 #Python
Python BS4库的安装与使用详解
Aug 08 #Python
python特性语法之遍历、公共方法、引用
Aug 08 #Python
You might like
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
python中函数默认值使用注意点详解
2016/06/01 Python
Python计算字符宽度的方法
2016/06/14 Python
Python如何快速实现分布式任务
2017/07/06 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
Python安装whl文件过程图解
2020/02/18 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
计算机网络专业个人的自我评价
2013/10/17 职场文书
英语专业应届生求职信范文
2013/11/15 职场文书
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
医院总经理岗位职责
2014/02/04 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
个人工作违纪检讨书
2015/05/05 职场文书