1. re模块

1.1 转义符

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

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

print('\\\\n')   # \\n
print('\\n') # \n print(r'\\n') # \\n
print(r'\n') # \n

1.2re模块的方法

1.2.1 re.findall()

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

import re

ret = re.findall('\d+','alex83')
print(ret)

1.2.2 re.search()

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

import re

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

1.2.3 re.match()

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

match = search + ^正则

import re

ret = re.match('\d','alex83') == re.match('^\d','alex83')
print(ret)

1.2.4 进阶方法

  • 1.时间复杂度 效率 compile

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

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

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

  • 3.用户体验

1.2.5 re.finditer()

import re

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

1.2.6 re.compile()

import re

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

1.2.7 re.split() 切割

import re

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

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

import re

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

1.3 分组的概念和re模块

1.3.1 分组命名

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

分组命名:

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

1.3.2 引用分组

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

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

findall 遇到分组

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

import re

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

分组和 findall

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

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

1.4 生成器的send方法

def func():
print(123)
n = yield 'aaa'
print('-->',n)
yield 'bbb' g = func()
print(g)
n = next(g)
print(n)
print('-'*20)
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. ZOJ1450 Minimal Circle 最小圆覆盖

    ZOJ1450 给定N个点(N<=100)求最小的圆把这些点全部覆盖 考虑对于三角形,可以唯一的找到外接圆,而多边形又可以分解为三角形,所以对于多边形也可以找到唯一的最小覆盖圆. #includ ...

  2. POJ2653 Pick-up sticks 判断线段相交

    POJ2653 判断线段相交的方法 先判断直线是否相交 再判断点是否在线段上 复杂度是常数的 题目保证最后答案小于1000 故从后往前尝试用后面的线段 "压"前面的线段 排除不可能 ...

  3. mipi差分信号原理

    差分信号,什么是差分信号 一个差分信号是用一个数值来表示两个物理量之间的差异.从严格意义上来讲,所有电压信号都是差分的,因为一个电压只能是相对于另一个电压而言的.在某些系统里,系统’地’被用作电压基准 ...

  4. bzoj2466

    高斯消元+搜索 很明显每个开关只能按一次,那么我们可以想到高斯消元,其实就是解异或方程组,但是最后会有一些自由元,也就是有x+y=z,x+y=z这种一样的方程就会产生自由元,那么我们爆搜自由元取值,每 ...

  5. 【高德地图API】绘制大地线 Geodesic/Great Circles

    大地线(geodesic)是指地球椭球面上连接两点的最短程曲线. 大地线上每点的密切面(无限接近的3个点所构成的平面)都包含此点的曲面法线.因曲面法线互不相交,故为一条空间曲面曲线.在球面上,大圆弧( ...

  6. 谷歌浏览器(Chrome)查看http报文headers信息

    转自:https://blog.csdn.net/floatdreamed/article/details/79208719 ①打开谷歌浏览器,随意输入要搜索的内容 ②按下F12键,此时会弹出浏览器的 ...

  7. java笔记线程方式1优先级

    * 我们的线程没有设置优先级,肯定有默认优先级. * 那么,默认优先级是多少呢? * 如何获取线程对象的优先级? *   public final int getPriority():返回线程对象的优 ...

  8. MogileFS介绍

    MogileFS介绍 MogileFS 是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发. Danga团队开发了包括 Memcached.Mog ...

  9. (进制)51NOD 1057 N的阶乘

    输入N求N的阶乘的准确值.   Input 输入N(1 <= N <= 10000) Output 输出N的阶乘 Input示例 5 Output示例 120解:这其实是MOD进制,将一个 ...

  10. Sql 主键设置

    1.开发数据库时常用命名规范 1>.使用不包含数字的单数表名,如果必要的话可以增加模块名前缀. 2>.对于主键的命名,使用表名+ID的形式. 3>.作为外键的列的名字应该与它们所对应 ...