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解析xml文件操作实例
Oct 05 Python
python实现堆栈与队列的方法
Jan 15 Python
Python使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
利用Python复制文件的9种方法总结
Sep 02 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
Python实现aes加密解密多种方法解析
May 15 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 Python
python实现取余操作的简单实例
Aug 16 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正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
javascript 写类方式之五
2009/07/05 Javascript
JavaScript 动态创建VML的方法
2009/10/14 Javascript
javascript document.compatMode兼容性
2010/02/23 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
使用Python实现一个简单的项目监控
2015/03/31 Python
Python 数据结构之旋转链表
2017/02/25 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis