一、简介

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

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

二、使用方法

  1、简单看一下写法

  函数语法:

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

  

  1. 函数参数说明:
  2. 参数 描述
  3. pattern 匹配的正则表达式
  4. string 要匹配的字符串。
  5. flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
  6.   匹配成功re.match方法返回一个匹配的对象,否则返回None
  7.   我们可以使用group(num) groups() 匹配对象函数来获取匹配表达式。
  8. 匹配对象方法 描述
  9. group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
  10. groups() 返回一个包含所有小组字符串的元组,从 1 所含的小组号。

  

  1. import re
  2.  
  3. p = re.compile('abcd')
  4. print(type(p))
  5. #<class '_sre.SRE_Pattern'>
  6. print(dir(p))
  7. #['__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']
  8. m = p.match('abcdef')
  9. print(type(m))
  10. #<class '_sre.SRE_Match'>
  11. print(dir(m))
  12. #['__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']
  13. print(m.group())
  14. #abcd
  15. print(m.group(0))
  16. #abcd

  

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

  1. import re
  2.  
  3. p = re.compile('abcd')
  4. m = p.match('abdcef')
  5. print(m.group())
  6. #AttributeError: 'NoneType' object has no attribute 'group'

  

  神奇的.

  1. import re
  2.  
  3. p = re.compile('.')
  4. m = p.match('abdcef')
  5. print(m.group())
  6. #a

  

  特殊字符(元字符)

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

  

  re.findall()

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

  

  数量词:

  贪婪模式和非贪婪模式

  1、一个小例子

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

  1. import re
  2.  
  3. p = re.compile('[abc]+')
  4. m = p.findall('abcdef')
  5. print(m)
  6. #*
  7. #['abc', '', '', '', '']
  8. #+
  9. #['abc']

  

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

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

  2、{}

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

  1. import re
  2.  
  3. p = re.compile('[abc]{3}')
  4. m = p.findall('abcdabcd')
  5. print(m)
  6. #{1}
  7. #['a', 'b', 'c', 'a', 'b', 'c']
  8. #{2}
  9. #['ab', 'ab']
  10. #{3}
  11. #['abc', 'abc']

  

  

  re.search方法

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

  1. import re
  2.  
  3. p = re.compile('abcd')
  4. m = p.search('abcdabcd')
  5. print(m.group())

  

  检索和替换

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

  1.  语法:
     
  1. re.sub(pattern, repl, string, count=0, flags=0)

参数:

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  1.  示例一:
     替换一#开头的所有字符(匹配任意字符0次或者多次),替换成无。
  1. import re
  2.  
  3. phone = "2004-959-559 # 这是一个国外电话号码"
  4. num = re.sub('#.*','',phone)
  5. print(num)

  示例一:扩展

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

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

  

  1.   

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

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

   

  1.  

python爬虫之正则表达式的更多相关文章

  1. 玩转python爬虫之正则表达式

    玩转python爬虫之正则表达式 这篇文章主要介绍了python爬虫的正则表达式,正则表达式在Python爬虫是必不可少的神兵利器,本文整理了Python中的正则表达式的相关内容,感兴趣的小伙伴们可以 ...

  2. 【Python爬虫】正则表达式与re模块

    正则表达式与re模块 阅读目录 在线正则表达式测试 常见匹配模式 re.match re.search re.findall re.compile 实战练习 在线正则表达式测试 http://tool ...

  3. python 爬虫之-- 正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. 正则表达式非python独有,python 提供了正则表达式的接口,re模块 一.正则匹配字符简介 模式 描述 \d ...

  4. python爬虫训练——正则表达式+BeautifulSoup爬图片

    这次练习爬 传送门 这贴吧里的美食图片. 如果通过img标签和class属性的话,用BeautifulSoup能很简单的解决,但是这次用一下正则表达式,我这也是参考了该博主的博文:传送门 所有图片的s ...

  5. 【python爬虫和正则表达式】爬取表格中的的二级链接

    开始进公司实习的一个任务是整理一个网页页面上二级链接的内容整理到EXCEL中,这项工作把我头都搞大了,整理了好几天,实习生就是端茶送水的.前段时间学了爬虫,于是我想能不能用python写一个爬虫一个个 ...

  6. Python爬虫运用正则表达式

    我看到最近几部电影很火,查了一下猫眼电影上的数据,发现还有个榜单,里面有各种经典和热映电影的排行榜,然后我觉得电影封面图还挺好看的,想着一张一张下载真是费时费力,于是突发奇想,好像可以用一下最近学的东 ...

  7. Python爬虫之正则表达式(3)

    # re.sub # 替换字符串中每一个匹配的子串后返回替换后的字符串 import re content = 'Extra strings Hello 1234567 World_This is a ...

  8. Python爬虫之正则表达式(1)

    廖雪峰正则表达式学习笔记 1:用\d可以匹配一个数字:用\w可以匹配一个字母或数字: '00\d' 可以匹配‘007’,但是无法匹配‘00A’; ‘\d\d\d’可以匹配‘010’: ‘\w\w\d’ ...

  9. Python爬虫基础——正则表达式

    说到爬虫,不可避免的会牵涉到正则表达式. 因为你需要清晰地知道你需要爬取什么信息?它们有什么共同点?可以怎么去表示它们? 而这些,都需要我们熟悉正则表达,才能更好地去提取. 先简单复习一下各表达式所代 ...

随机推荐

  1. day03-课堂笔记-大纲

    字典: # 字典循环: dic.keys() | dic.values() | dic.items()for k, v in dic.items():    print(k, v)        # ...

  2. P1184 高手之在一起(字典树模板题,hash算法, map)

    哎,唯一值得说明的是,这道题的输入有bug 先把字典树的算法模板放一下 #include<iostream> #include<cstring> using namespace ...

  3. 【转】ffmpeg常用基本命令

    [FFmpeg]FFmpeg常用基本命令 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 ffmpe ...

  4. 第23章 Spring MVC初体验

    23.1 鸟瞰Spring MVC 粗略的介绍了SpringMVC的主要组成部分,SpringMVC作为一个Web层的框架,最大的作用是把我从繁重的web.xml文件编写中解救出来,再也不要不停的添加 ...

  5. 007_Mac上安装Node和NPM

    一.推荐brew来对node和npm版本进行管理. <1>确保brew是安全可靠的,代码如下: $ brew doctor #直接install node会有以下报错https://git ...

  6. 最长上升子序列(LIS)

    (我先扯些没用的) 我这个笨孩子 学点东西好慢好慢的 我还贪玩 于是 将自己陷入了一个超级超级超级差的境地 可 我还傻乎乎的保有着天真的梦想(理想?) 所以现在我要加倍的努力努力再努力了 只能嘎油了 ...

  7. 用ASP.NET MVC仿站糗事百科

    废话就不多说,直接来操作,有些细节问题就不一一解说了(没有几天几夜都说不完),主意是想让大家看完知道大概这个框架是怎么搭建的就可以了 一. 新建一个解决方案,搭建三层架构,分别为: DAL层  .DL ...

  8. JSOUP如何POST只含JSON格式的数据

    引言 现在前后端分离渐渐成为主流,网站可以通过json格式的数据和服务端进行交互,比如下图: 关于这点,JSOUP官方API文档已经给出了解决方法 Connection requestBody​(St ...

  9. Elastic 今日在纽交所上市,股价最高暴涨122%。

    10 月 6 日,Elastic 正式在纽约证券交易所上市,股票代码为"ESTC".开盘之后股价直线拉升,最高点涨幅达122%,截止到收盘涨幅回落到94%,意味着上市第一天估值接近 ...

  10. Groovy语言学习--语法基础(1)

    2018年11月末,从上家公司离职后进入现在的公司.进入项目以来,发现项目中有很多groovy脚本,以前没接触过groovy,抽时间系统地学一下,也方便后期项目的开发和维护. groovy和java的 ...