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. C#直接删除指定目录下的所有文件及文件夹(保留目录)

    #region 直接删除指定目录下的所有文件及文件夹(保留目录) /// <summary> /// 直接删除指定目录下的所有文件及文件夹(保留目录) /// </summary&g ...

  2. C++中正确使用PRId64 (转载)

    转自:http://blog.csdn.net/win_lin/article/details/7912693 例子参考高性能流媒体服务器SRS:https://github.com/winlinvi ...

  3. MARK ZUCKERBERG, A letter to our daughter(转)

    A letter to our daughter   MARK ZUCKERBERG·WEDNESDAY, DECEMBER 2, 2015   Dear Max, Your mother and I ...

  4. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形【叉积+极角排序+瞎搞】

    参考:https://blog.csdn.net/u012288458/article/details/50830498 有点神啊 正难则反,考虑计算不符合要求的三角形.具体方法是枚举每个点,把这个点 ...

  5. 10.9NOIP模拟题

    /* big模拟 细节不少 remove表示这个玩意儿在这一秒有没有移动 注意在一秒内所有小葱一起移动,所以如果一个一个处理 别忘了“错位”这种情况 */ #include<iostream&g ...

  6. maptalks 如何加载 ArcGIS 瓦片图层

    最近需要加载 ArcGIS 瓦片图层,运行官网加载 ArcGIS 瓦片图层的 demo 是没有问题的.如果把 ArcGIS 瓦片图层 URL 换成是自已发布的 ArcGIS 地图服务,发现加载不出来, ...

  7. Sql 主键设置

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

  8. 数学 Codeforces Round #219 (Div. 2) B. Making Sequences is Fun

    题目传送门 /* 数学:这题一直WA在13组上,看了数据才知道是计算cost时超long long了 另外不足一个区间的直接计算个数就可以了 */ #include <cstdio> #i ...

  9. MyEclipse日志文件目录

    MyEclipse存放日志的目录为: <Workspace_Root>/.metadata/.log 在该目录下存放了日志的存档和当前日志,通过该日志可以查看MyEclipse的错误信息.

  10. 376 Wiggle Subsequence 摆动序列

    A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...