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中返回字典键的值的values()方法使用
May 22 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
Jan 04 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
使用python的pexpect模块,实现远程免密登录的示例
Feb 14 Python
Python3之手动创建迭代器的实例代码
May 22 Python
python 同时读取多个文件的例子
Jul 16 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
Oct 23 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
浅谈Python项目的服务器部署
Apr 25 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
PHP实现图片压缩
2020/09/09 PHP
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
python logging模块的使用
2020/09/07 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
会计专业毕业自荐书范文
2014/02/08 职场文书
个人廉洁自律承诺书
2014/03/27 职场文书
出生证明公证书
2014/04/09 职场文书
暑假学习心得体会
2014/09/02 职场文书
报效祖国演讲稿
2014/09/15 职场文书
质量整改报告范文
2014/11/08 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python
Pillow图像处理库安装及使用
2022/04/12 Python