python re模块与正则
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 小总结
正则 ?都能做什么?
- ?表示匹配0次或1次 表示可有可无 但是有只能有一个 比如小数点
- 用于非贪婪匹配:.*?x 匹配任意的内容任意多次遇到x就立即停止
- 分组命名: (?P<名字>正则表达式)
- 引用分组: (?P=组名)
- findall 遇到正则表达式中的分组时,?: 取消分组优先显示
python re模块与正则的更多相关文章
- python——re模块(正则表达)
python——re模块(正则表达) 两个比较不错的正则帖子: http://blog.csdn.net/riba2534/article/details/54288552 http://blog.c ...
- Python之模块、正则
一.模块import 模块的实质就是把要导入模块里面的代码,从上到下执行一遍,找模块的顺序是,先从当前目录下找,找不到的话,再环境变量里面找导入的模块名字最好不要有.,a.import sysprin ...
- 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 ...
- Day05 - Python 常用模块
1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...
- python常用模块(1):collections模块和re模块(正则表达式详解)
从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来 ...
- Python xml 模块
Python xml 模块 TOC 什么是xml? xml和json的区别 xml现今的应用 xml的解析方式 xml.etree.ElementTree SAX(xml.parsers.expat) ...
- Python re 模块
Python re 模块 TOC 介绍 作用 正则表达式语法 贪婪和非贪婪 普通字符和特殊字符 分组(比较重要) re modul level 方法 正则表达式对象 匹配对象 常用例子 注意事项 Ja ...
- 更强大的python正则表达式模块 -- regex
python内置的正则表达库re比较弱,而且似乎在好几年里都没太大的变化. 这里介绍这个python模块regex,实现了更多方便好用的功能. 比如:\p{han} 可以匹配汉字, \p{Latin} ...
- Learning-Python【21】:Python常用模块(4)—— re、logging、hashlib、subprocess
re 模块:与正则相关的模块 在使用 re 模块之前,需要先了解正则表达式(regular expression),描述了一种字符串匹配的模式(pattern),可以用来检查一个字符串是否含有某个子字 ...
随机推荐
- codeforces 963B Destruction of a Tree
B. Destruction of a Tree time limit per test 1 second memory limit per test 256 megabytes input stan ...
- python 使用.bat文件自动执行
@echo off title demo cmd "/c activate py36 && cd demo&& python demo_test.py&quo ...
- luogu3899谈笑风生
https://www.zybuluo.com/ysner/note/1298140 题面 设\(T\)为一棵有根树,我们做如下的定义: 设\(a\)和\(b\)为\(T\)中的两个不同节点.如果\( ...
- java编程中的断言工具类(org.springframework.util.Assert)
转自:https://blog.csdn.net/gokeiryou263/article/details/19612471 断言工具类:Assert类, java.lang.Object ---&g ...
- mysql数据库中的十进位是什么意思?
一般在用小数的时候才有用,比如类型你设置了double,十进位你设为2,那么你可以放0.22的值,但是放0.222的值它会自动四舍五入为0.22,相当于小数位数吧
- poj 1201 Intervals【差分约束+spfa】
设s为前缀和,首先显然的条件是\[ s_{bi}-s_{ai-1}>=c \],然后隐含的是\[ s_i-s_{i-1}>=0 s_i-s_{i-1}<=1 \] 然后根据差分约束, ...
- codeforces GYM 100781A【树的直径】
先求出每棵树的直径,排个序,要想图的直径最小的话需要每棵树的直径中点像直径最大的树的直径中点连边,这样直径有三种情况:是直径最大的树的直径:a[tot]:是直径最大的树和直径第二大的树的半径拼起来+1 ...
- ionic之AngularJS扩展动态组件
目录: 1. 模态对话框 : $ionicModal 2. 上拉菜单 : $ionicActionSheet 3. 弹出框 : $ionicPopup 4. 浮动框 : $ionicPopover 5 ...
- 微信小程序获取自定义属性值
写小程序的时候用到了自定义属性,特地来记录一下 特别是这个坑,必须得说一说 wxml <view class='box' bindtap='getValue'> <view clas ...
- 365 Water and Jug Problem 水壶问题
有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水.你允许: 装满任 ...