re模块中常用功能函数

1、compile()

编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)

格式:

re.compile(pattern,flags=0)

pattern: 编译时用的表达式字符串。

flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:

标志
含义
re.S(DOTALL)
使.匹配包括换行在内的所有字符
re.I(IGNORECASE)
使匹配对大小写不敏感
re.L(LOCALE)
做本地化识别(locale-aware)匹配,法语等
re.M(MULTILINE)
多行匹配,影响^和$
re.X(VERBOSE)
该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
re.U
根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B
  1. import re
  2. tt = "Tina is a good girl, she is cool, clever, and so on..."
  3. rr = re.compile(r'\w*oo\w*')
  4. print(rr.findall(tt)) #查找所有包含'oo'的单词
  5. 执行结果如下:
  6. ['good', 'cool']

2、match()

决定re是否在字符串刚开始的位置匹配。//注:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'

格式:

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

  1. print(re.match('com','comwww.runcomoob').group())
  2. print(re.match('com','Comwww.runcomoob',re.I).group())
  3. 执行结果如下:
  4. com
  5. com
  1. import re
  2.  
  3. # 将正则表达式编译成Pattern对象
  4. pattern = re.compile(r'rlovep')
  5. # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
  6. m = pattern.match('rlovep.com')
  7. if m:
  8. # 使用Match获得分组信息
  9. print(m.group())
  10. ### 输出 ###
  11. # rlovep
  1. #re.match.
  2. import re
  3. print(re.match("rlovep","rlovep.com"))##匹配rlovep
  4. print(re.match("rlovep","rlovep.com").span())##从开头匹配rlovep
  5. print(re.match("com","http://rlovep.com"))##不再起始位置不能匹配成功
  6. ##输出:
  7. <_sre.SRE_Match object; span=(0, 6), match='rlovep'>
  8. (0, 6)
  9. None

3、search()

格式:

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

re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。

  1. print(re.search('\dcom','www.4comrunoob.5com').group())
  2. 执行结果如下:
  3. 4com

*注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

  • group() 返回被 RE 匹配的字符串
  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置
  • group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。

a. group()返回re整体匹配的字符串,
b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
c.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组

  1. import re
  2. a = "123abc456"
  3. print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) #123abc456,返回整体
  4. print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) #
  5. print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) #abc
  6. print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) #456
  1. ###group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。###
  1. import re
  2.  
  3. line = "This is my blog"
  4. #匹配含有is的字符串
  5. matchObj = re.match( r'(.*) is (.*?) .*', line, re.M|re.I)
  6. #使用了组输出:当group不带参数是将整个匹配成功的输出
  7. #当带参数为1时匹配的是最外层左边包括的第一个括号,一次类推;
  8. if matchObj:
  9. print ("matchObj.group() : ", matchObj.group())#匹配整个
  10. print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一个括号
  11. print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二个括号
  12. else:
  13. print ("No match!!")
  14.  
  15. #输出:
  16.  
  17. matchObj.group() : This is my blog
  18. matchObj.group(1) : This
  19. matchObj.group(2) : my

4、findall()

re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。

格式:

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

  1. p = re.compile(r'\d+')
  2. print(p.findall('o1n2m3k4'))
  3. 执行结果如下:
  4. ['', '', '', '']
  1. import re
  2. tt = "Tina is a good girl, she is cool, clever, and so on..."
  3. print(re.findall(r'\w*oo\w',tt))
  4. 执行结果如下:
  5. ['good', 'cool']

5、finditer()

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。

格式:

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

  1. iter = re.finditer(r'\d+','12 drumm44ers drumming, 11 ... 10 ...')
  2. for i in iter:
  3. print(i)
  4. print(i.group())
  5. print(i.span())
  6. 执行结果如下:
  7. <_sre.SRE_Match object; span=(0, 2), match=''>
  8. (0, 2)
  9. <_sre.SRE_Match object; span=(8, 10), match=''>
  10. (8, 10)
  11. <_sre.SRE_Match object; span=(24, 26), match=''>
  12. (24, 26)
  13. <_sre.SRE_Match object; span=(31, 33), match=''>
  14. (31, 33)

6、split()

按照能够匹配的子串将string分割后返回列表。

可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。

格式:

re.split(pattern, string[, maxsplit])

maxsplit用于指定最大分割次数,不指定将全部分割。

  1. print(re.split('\d+','one1two2three3four4five5'))
  2. 执行结果如下:
  3. ['one', 'two', 'three', 'four', 'five', '']

7、sub()

使用re替换string中每一个匹配的子串后返回替换后的字符串。

格式:

re.sub(pattern, repl, string, count)

  1. import re
  2. text = "JGood is a handsome boy, he is cool, clever, and so on..."
  3. print(re.sub(r'\s+', '-', text))
  4. 执行结果如下:
  5. JGood-is-a-handsome-boy,-he-is-cool,-clever,-and-so-on...
  6. 其中第二个函数是替换后的字符串;本例中为'-'
  7. 第四个参数指替换个数。默认为0,表示每个匹配项都替换。

re.sub还允许使用函数对匹配项的替换进行复杂的处理。

如:re.sub(r'\s', lambda m: '[' + m.group(0) + ']', text, 0);将字符串中的空格' '替换为'[ ]'。

  1. import re
  2. text = "JGood is a handsome boy, he is cool, clever, and so on..."
  3. print(re.sub(r'\s+', lambda m:'['+m.group(0)+']', text,0))
  4. 执行结果如下:
  5. JGood[ ]is[ ]a[ ]handsome[ ]boy,[ ]he[ ]is[ ]cool,[ ]clever,[ ]and[ ]so[ ]on...

8、subn()

返回替换次数

格式:

subn(pattern, repl, string, count=0, flags=0)

  1. print(re.subn('[1-2]','A','123456abcdef'))
  2. print(re.sub("g.t","have",'I get A, I got B ,I gut C'))
  3. print(re.subn("g.t","have",'I get A, I got B ,I gut C'))
  4. 执行结果如下:
  5. ('AA3456abcdef', 2)
  6. I have A, I have B ,I have C
  7. ('I have A, I have B ,I have C', 3)

四、一些注意点

1、re.match与re.search与re.findall的区别:

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

  1. a=re.search('[\d]',"abc33").group()
  2. print(a)
  3. p=re.match('[\d]',"abc33")
  4. print(p)
  5. b=re.findall('[\d]',"abc33")
  6. print(b)
  7. 执行结果:
  8. None
  9. ['', '']
  1. a = re.match('<(.*)>','<H1>title<H1>').group()
  2. print(a)
  3. b = re.match('<(.*?)>','<H1>title<H1>').group()
  4. print(b)
  5. 执行结果:
  6. <H1>title<H1>
  7. <H1>
  1. a = re.findall(r"a(\d+)b",'a3333b')
  2. print(a)
  3. b = re.findall(r"a(\d+?)b",'a3333b')
  4. print(b)
  5. 执行结果如下:
  6. ['']
  7. ['']
  8. #######################
  9. 这里需要注意的是如果前后均有限定条件的时候,就不存在什么贪婪模式了,非匹配模式失效。

3、用flags时遇到的小坑

  1. print(re.split('a','1A1a2A3',re.I))#输出结果并未能区分大小写
  2. 这是因为re.split(patternstringmaxsplit,flags)默认是四个参数,当我们传入的三个参数的时候,系统会默认re.I是第三个参数,所以就没起作用。如果想让这里的re.I起作用,写成flags=re.I即可。

本文转自:https://www.cnblogs.com/tina-python/p/5508402.html

python-爬虫之re模块的更多相关文章

  1. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  2. Python爬虫之urllib模块1

    Python爬虫之urllib模块1 本文来自网友投稿.作者PG,一个待毕业待就业二流大学生.玄魂工作室未对该文章内容做任何改变. 因为本人一直对推理悬疑比较感兴趣,所以这次爬取的网站也是平时看一些悬 ...

  3. Python爬虫教程-09-error 模块

    Python爬虫教程-09-error模块 今天的主角是error,爬取的时候,很容易出现错,所以我们要在代码里做一些,常见错误的处,关于urllib.error URLError URLError ...

  4. 孤荷凌寒自学python第六十七天初步了解Python爬虫初识requests模块

    孤荷凌寒自学python第六十七天初步了解Python爬虫初识requests模块 (完整学习过程屏幕记录视频地址在文末) 从今天起开始正式学习Python的爬虫. 今天已经初步了解了两个主要的模块: ...

  5. Python爬虫练习(requests模块)

    Python爬虫练习(requests模块) 关注公众号"轻松学编程"了解更多. 一.使用正则表达式解析页面和提取数据 1.爬取动态数据(js格式) 爬取http://fund.e ...

  6. Python 爬虫二 requests模块

    requests模块 Requests模块 get方法请求 整体演示一下: import requests response = requests.get("https://www.baid ...

  7. Python爬虫之requests模块(1)

    一.引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症.冗余代码症.重新发明轮子症.啃 ...

  8. Python爬虫之requests模块(2)

    一.今日内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 二.回顾 xpath的解析流程 bs4的解析流程 常用xpath表达式 常用bs4解析方法 三. ...

  9. python爬虫值requests模块

    - 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在 ...

  10. Python爬虫(requests模块)

     Requests是唯一的一个非转基因的Python HTTP库,人类可以安全享用. Requests基础学习 使用方法: 1.导入Requests模块: import requests 2.尝试用g ...

随机推荐

  1. Partition--分区切换2

    有分区表TB2和TB2_History CREATE TABLE TB2( ID  BIGINT IDENTITY(1,1) PRIMARY KEY, C1 NVARCHAR(200))ON[ps_T ...

  2. 按照已有的模板输出<一>(如发票)

    按照已有的模板输出<一> 普通的发票基本上都是固定模式,所以我们一般写好固定的模板,把其中需要变动的地方,以特定符号来代替.每次打印发票的时候,只需将其中的特定符号转换成我们需要显示的数据 ...

  3. 菜鸟的Xamarin.Forms前行之路——原生Toast的简单实现方法

    项目中信息提示框,貌似只有个DisplayAlert,信息提示太过于单一,且在有些场合Toast更加实用,以下是一个简单的原生Toast的实现方法 项目地址:https://github.com/we ...

  4. vue和jQuery的区别

    从jquery到vue或者说是到mvvm的转变是一个思想的转变,是将原有的直接操作dom的思想转变到操作数据上去 vue和jquey对比 jQuery是使用选择器($)选取DOM对象,对其进行赋值.取 ...

  5. [Maven实战-许晓斌]-[第三章] Mave使用入门二(在IDE中的使用) [第四章] 案例的背景介绍

    创建maven项目

  6. SPOJ 3267 DQUERY(离线+树状数组)

    传送门 话说这好像HH的项链啊…… 然后就说一说上次看到的一位大佬很厉害的办法吧 对于所有$r$相等的询问,需要统计有多少个不同的数,那么对于同一个数字,我们只需要关心它最右边的那一个 比如$1,2, ...

  7. [ActionScript 3.0] 透视投影

    下面的示例演示如何使用透视投影来创建 3D 空间.该示例演示如何通过projectionCenter属性来修改消失点和更改空间的透视投影.进行这种修改后,将强制重新计算focalLength和fiel ...

  8. java类的基本结构

    对象依赖于类存在. 分析过程先有对象后有类,开发过程中先有类后有对象. new是为新建对象开辟内存空间的运算符:以类为模板,开辟空间实例化一个对象,并返回该对象的一个引用. 成员变量 直接在类中定义 ...

  9. webpack中设置jquery为全局对象

    通过npm安装jquery npm install jquery -D 然后配置webpack-config.js plugins: [ new webpack.ProvidePlugin({ $: ...

  10. 程序设计中的dry原则

    DRY:dont repeat yourself 假设一个逻辑(代码块)会重复两次或者以上,应该写成函数被调用 为什么呢,实际上,我们处处可见重复性的代码.这除了增加工作量之外,还会增加维护难度. d ...