1. re模块

1.1 转义符

正则表达式中的转义符在python的字符串中也刚好有转移的作用,但是正则表达式中的转义符和字符串中的转义符并没关系,且还容易有冲突。

为了避免这种冲突,我们所有的正则都以在工具中的测试结果为结果,然后只需要在正则和待匹配的字符串外面都加r即可

  1. print('\\\\n') # \\n
  2. print('\\n') # \n
  3. print(r'\\n') # \\n
  4. print(r'\n') # \n

1.2re模块的方法

1.2.1 re.findall()

findall 会匹配字符串中所有符合规则的项,并返回一个列表,如果未匹配到,则返回空列表。

  1. import re
  2. ret = re.findall('\d+','alex83')
  3. print(ret)

1.2.2 re.search()

search 会从头到尾从带匹配匹配字符串中取出第一个符合条件的项,如果匹配到了,返回一个对象,用group取值;如果没匹配到,返回None,不能用group取值。

  1. import re
  2. ret = re.search('\d+','alex83')
  3. print(ret) # 如果能匹配上返回一个对象,如果不能匹配上返回None
  4. if ret:
  5. print(ret.group()) # 如果是对象,那么这个对象内部实现了group,所以可以取值
  6. # 如果是None,那么这个对象不可能实现了group方法,所以报错

1.2.3 re.match()

match 会从头匹配字符串中取出从第一个字符开始是否符合规则,如果符合,就返回对象,用group取值;如果不符合,就返回None.

match = search + ^正则

  1. import re
  2. ret = re.match('\d','alex83') == re.match('^\d','alex83')
  3. print(ret)

1.2.4 进阶方法

  • 1.时间复杂度 效率 compile

    在同一个正则表达式重复使用多次的时候使用能够减少时间的开销

  • 2.空间复杂度 内存占用率 finditer

    在查询的结果超过1个的情况下,能够有效的节省内存,降低空间复杂度,从而也降低了时间复杂度

  • 3.用户体验

1.2.5 re.finditer()

  1. import re
  2. ret = re.findall('\d','safhl02urhefy023908'*20000000) # 时间复杂度、空间复杂度都非常高
  3. print(ret)
  4. ret = re.finditer('\d','safhl02urhefy023908'*20000000) # ret是迭代器
  5. for i in ret: # 迭代出来的每一项都是一个对象
  6. print(i.group()) # 通过group取值即可

1.2.6 re.compile()

  1. import re
  2. ret = re.compile('\d3') # 先配置好正则
  3. print(ret)
  4. r1 = ret.search('alex83') # 可以直接调用
  5. print(r1)
  6. ret.findall('wusir74')
  7. ret = re.compile('\d+')
  8. r3 = ret.finditer('taibai40')
  9. for i in r3:
  10. print(i.group())
  11. \d 正则表达式 ——> 字符串
  12. \d str
  13. 循环str,找到所有的数字

1.2.7 re.split() 切割

  1. import re
  2. ret = re.split('\d+','alex83wusir74taibai')
  3. print(ret) # ['alex', 'wusir', 'taibai']
  4. ret = re.split('\d(\d)','alex83wusir74taibai') # 默认自动保留分组中的内容(被切割掉的内容)
  5. print(ret) # ['alex', '3', 'wusir', '4', 'taibai']

1.2.8 re.sub() / re.subn() 替换

  1. import re
  2. ret = re.sub('\d','D','alex83wusir74taibai',1)
  3. print(ret) # alexD3wusir74taibai
  4. ret = re.sub('\d','D','alex83wusir74taibai',3) # 3表示替换掉几个
  5. print(ret) # alexDDwusirD4taibai
  6. ret = re.subn('\d','D','alex83wusir74taibai') # subn 直接全部替换的
  7. print(ret) # ('alexDDwusirDDtaibai', 4) # 得到一个元组,并把一共替换掉几个作为元组的一个元素

1.3 分组的概念和re模块

1.3.1 分组命名

  1. s1 = '<h1>wahaha</h1>'
  2. s2 = '<a>wahaha ya wahaha</a>'
  3. # s1 -> h1 wahaha
  4. # s2 -> a wahaha ya wahaha
  5. import re
  6. # 方法一
  7. ret = re.search('<(\w+)>(.*?)</\w+>',s1)
  8. print(ret)
  9. print(ret.group(0)) # group参数默认为0 表示取整个正则匹配的结果
  10. print(ret.group(1)) # 取第一个分组中的内容
  11. print(ret.group(2)) # 取第二个分组中的内容
  12. # 方法二(分组命名)
  13. ret = re.search('<(?P<tag>\w+)>(?P<cont>.*?)</\w+>',s1)
  14. print(ret)
  15. print(ret.group('tag')) # 取tag分组中的内容
  16. print(ret.group('cont')) # 取cont分组中的内容

分组命名:

(?P<名字>正则表达式)

1.3.2 引用分组

引用分组 (?P=组名) 这个组中的内容必须完全和之前已经存在的组匹配到的内容一模一样

  1. s1 = '<h1>wahaha</h1>'
  2. s2 = '<a>wahaha ya wahaha</a>'
  3. ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s1) # 用于约束前后<>内的内容一致
  4. print(ret.group('tag')) # h1
  5. # \1:转义1,表示分组中的
  6. s1 = '<h1>wahaha</h1>'
  7. s2 = '<a>wahaha ya wahaha</a>'
  8. ret = re.search(r'<(\w+)>.*?</\1>',s1)
  9. print(ret.group(1)) # h1

findall 遇到分组

findall 遇到正则表达式中的分组,会优先显示分组中的内容

  1. import re
  2. ret = re.findall('\d(\d)','aa1alex83')
  3. # findall遇到正则表达式中的分组,会优先显示分组中的内容
  4. print(ret)
  5. ret = re.findall('\d+(?:\.\d+)?','1.234+2') # ?: 取消分组优先显示
  6. print(ret)

分组和 findall

  • 默认findall 优先显示分组内的内容
  • 取消分组优先显示 (?:正则)
  1. # 例题
  2. # 有的时候我们想匹配的内容包含在不相匹配的内容当中,这个时候只需要把不想匹配的先匹配出来,再通过手段去掉
  3. import re
  4. ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
  5. print(ret)
  6. ret.remove('')
  7. print(ret)

split 遇到分组:会保留分组中本来应该被切割掉的内容

1.4 生成器的send方法

  1. def func():
  2. print(123)
  3. n = yield 'aaa'
  4. print('-->',n)
  5. yield 'bbb'
  6. g = func()
  7. print(g)
  8. n = next(g)
  9. print(n)
  10. print('-'*20)
  11. next(g) # g.send('uysdfhfoiusyg')与next(g)的作用一样

1.5 小总结

正则 ?都能做什么?

    1. ?表示匹配0次或1次 表示可有可无 但是有只能有一个 比如小数点
    2. 用于非贪婪匹配:.*?x 匹配任意的内容任意多次遇到x就立即停止
    3. 分组命名: (?P<名字>正则表达式)
    4. 引用分组: (?P=组名)
    5. findall 遇到正则表达式中的分组时,?: 取消分组优先显示

python re模块与正则的更多相关文章

  1. python——re模块(正则表达)

    python——re模块(正则表达) 两个比较不错的正则帖子: http://blog.csdn.net/riba2534/article/details/54288552 http://blog.c ...

  2. Python之模块、正则

    一.模块import 模块的实质就是把要导入模块里面的代码,从上到下执行一遍,找模块的顺序是,先从当前目录下找,找不到的话,再环境变量里面找导入的模块名字最好不要有.,a.import sysprin ...

  3. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  4. Day05 - Python 常用模块

    1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...

  5. python常用模块(1):collections模块和re模块(正则表达式详解)

    从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来 ...

  6. Python xml 模块

    Python xml 模块 TOC 什么是xml? xml和json的区别 xml现今的应用 xml的解析方式 xml.etree.ElementTree SAX(xml.parsers.expat) ...

  7. Python re 模块

    Python re 模块 TOC 介绍 作用 正则表达式语法 贪婪和非贪婪 普通字符和特殊字符 分组(比较重要) re modul level 方法 正则表达式对象 匹配对象 常用例子 注意事项 Ja ...

  8. 更强大的python正则表达式模块 -- regex

    python内置的正则表达库re比较弱,而且似乎在好几年里都没太大的变化. 这里介绍这个python模块regex,实现了更多方便好用的功能. 比如:\p{han} 可以匹配汉字, \p{Latin} ...

  9. Learning-Python【21】:Python常用模块(4)—— re、logging、hashlib、subprocess

    re 模块:与正则相关的模块 在使用 re 模块之前,需要先了解正则表达式(regular expression),描述了一种字符串匹配的模式(pattern),可以用来检查一个字符串是否含有某个子字 ...

随机推荐

  1. ECS服务器配置密钥登录及常用日志

    一.介绍 1.SSH(22端口)是Secure Shell Protocol的简写,由IETF网络工作小组(Network Working Group)制定:在进行数据传输之前,SSH先对联机数据包通 ...

  2. PCB Genesis加邮票孔(弧与弧)实现算法

    一.Genesis加邮票孔(弧与弧)实现算法 1.鼠标点击位置P点(可以确认搜索区域位置,确认点击位置周边元素分区,此所讲算法未应用到P点坐标) 2.求出:P1C与P2C (线与弧最近点距离的2个点) ...

  3. PCB 机器学习(ML.NET)初体验实现PCB加投率预测

    使用ML.NET建立PCB加投率模型对单一蚀刻工序进行加投率预测, 此实例为最简单预测,要想实现全流程加投率预测挑战难度还是挺大的,可以查看另一种关于大数据在PCB行业应用---加投率计算基本原理:P ...

  4. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理-转载

    内容是摘抄的,不知最初的原作者,见谅 Java 动态代理.具体有如下四步骤: 通过实现 InvocationHandler 接口创建自己的调用处理器: 通过为 Proxy 类指定 ClassLoade ...

  5. 3-3 编程练习:jQuery键盘事件案例

    3-3 编程练习 完善下面的代码,在input框中输入内容的时候同样显示在下面的p标签中 <!DOCTYPE html> <html lang="zh-CN"&g ...

  6. java io 读取写文件

    java 读取txt文件,汉字乱码,原因是因为文件的编码格式和程序编码采用了不同的编码格式.通常,假如自己不修改的话,windows自身采用的编码格式是gbk(而gbk和gb2312基本上是一样的编码 ...

  7. Selct 大全

    添加option $("#ID option").each(function(){ if($(this).val()==111){ $(this).remove(); } }); ...

  8. MySql 同表复制数据 可以改变数据

    Mysql语法: INSERT INTO 表名 (字段) SELECT 字段 FROM 表名 WHERE 条件: 如果要修改其中某一个字段,在查询语句中:x(要改变的值) as 字段名. eg: IN ...

  9. pip安装itchat模块成功后annocanda中No module named 'itchat'

    在cmd中pip install itchat 成功后在annocanda中却出现了下面的情况: 经过查找网上各种查询,原来pip默认是把东西安装在系统python环境中,即C:\Python27\L ...

  10. C#知识点-枚举器和迭代器

    一.几个基本概念的理解 问题一:为什么数组可以使用foreach输出各元素 答:数组是可枚举类型,它实现了一个枚举器(enumerator)对象:枚举器知道各元素的次序并跟踪它们的位置,然后返回请求的 ...