python正则-re的使用
今天在刷题的时候用到了正则,用的过程中就感觉有点不太熟练了,很久没有用正则都有点忘了。所以现在呢,我们就一起来review一下python中正则模块re的用法吧。
今天是review,所以一些基础的概念就不做介绍了,先来看正则中的修饰符以及它的功能:
修饰符
- re.I 使匹配对大小写不敏感
- re.L 做本地化识别匹配
- re.M 多行匹配,影响^和$
- re.S 使.匹配包括换行在内的所有字符
- re.U 根据Unicode字符集解析字符.这个标志影响\w \W \b \B
- re.X 该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解.
模式
- ^ 匹配字符串开头
- $ 匹配字符串结尾
- . 匹配人以字符,除了换行符号.当re.DOTAALL标记被指定时,则可以匹配包括换行符的任意字符.
- [...] 用来表示一组字符,单独列出:[amk]匹配a,m或k
- [^...] 不在[]中的字符:[^amk]匹配除amk之外的字符
- re* 匹配0个或多个的表达式
- re+ 匹配1个或多个的表达式
- re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式.
- re{n} 精准匹配n个前面表达式
- re{n,} 匹配大于等于n个前面表达式
- re{n,m} 匹配n到m个前面的表达式定义的片段,贪婪方式
- a|b 匹配a或b
- (re) 对正则表达式分组,并记住匹配的文本
- (?imx) 正则表达式包含三种可选标志,imx,只影响括号中的区域.
- (?-imx) 正则表达式关闭imx可选标志,只影响括号中的区域.
- (?:re) 类似(...)但不表示一个组
- (?imx:re) 在括号中使用imx可选标志
- (?-imx:re) 在括号中不是用imx可选标志
- (?#...) 注释
- (?=re) 前向肯定界定符.如果所含正则表达式,以...表示,在当前位置成功匹配时成功,否则失败.但一旦所含表达式已经尝试,匹配引擎根本没有提高,模式的剩余部分还要尝试界定符右边.
- (?!re) 前向否定界定符.与肯定界定符相反;当所含的表达式不能在字符串当前位置匹配成功时成功.
- (?>re) 匹配的独立模式,省去回朔.
- \w 匹配字符数字以及下划线
- \W 匹配非字母数字下划线
- \s 匹配任意空白字符,等价于[\t\n\r\f]
- \S 匹配任意非空白字符
- \d 匹配任意数字
- \D 匹配任意非数字
- \A 匹配字符串开始
- \Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串.
- \z 匹配字符串结束
- \G 匹配最后匹配完成的位置
- \b 匹配一个单词边界,也就是指单词和空格之间的位置
- \B 匹配非单词边界
- \n \t 匹配一个换行符,一个制表符
- \1...\9 匹配第n个分组的内容
上面这些呢,是我们会用到的一些模式,这里面绝大部分都是应该熟记于心的。
接下来我们看re的一些方法:
re.compile
这个方法会生成一个正则对象,他的第一个参数是正则字符串,第二个参数是修饰符,就是 re.I, re.S 这些。
生成的这个正则对象呢,它还有一些方法,比如match、findall、finditer、search等等,这些方法的用法请往下看。
re.match
match方法是从给定字符串的开头开始进行匹配,并且只匹配一次。也就是说如果字符串和正则的第一个字母就对不上那就匹配失败了。
ta的参数是pettern,string,flags
pettern 就是正则字符串,如果是通过re.compile方法生成的正则对象.match来调用的话,就不需要这个参数了,因为正则对象本身就代表了一个正则匹配模式。
string 就是要进行匹配的目标字符串
flags 就是正则的修饰符,比如 re.I
match 如果匹配失败返回None,匹配惩罚返回的则是一个match对象。
match对象有一些方法,比较常用的有:span、group、groups等等
- span 方法返回的一个二元组,分别表示匹配字符串在目标字符串中的起始下标和结束下标
- group 函数有一个int类型的参数,参数为0表示返回正则匹配的字符串,参数为1返回正则中第一个组匹配的内容,2返回第二组的内容一次类推
- groups 函数是所有group函数结果组成一个元组。
re.search
search 函数和 match 函数是类似的,区别在于match方法是只在目标函数开头匹配一次;search函数是在整个目标函数上匹配一次,一次匹配成功后不再进行匹配。
同样search方法返回的也是一个match对象,用法和match方法返回的结果一样。
re.split
split 函数是用来分割字符串的一个函数。它的功能就是根据匹配的字符串对目标字符串进行分割,返回的结果是一个列表。
需要注意的是,如果正则中有组,组内的字符在结果列表中也会保留,不是组内的字符在结果列表中不会被保留。什么意思呢?通过一个例子来看一下:
st = 'www.baidu.com www.taobao.com'
result = re.split('bai(du)', st)
print(result)
结果:['www.', 'du', '.com www.taobao.com']
可以看到,字符串‘du’是被括号括起来的,所以在结果中也有'du'这个元素,而'bai'没有被括号括起来,在结果中就不会有‘bai’这个元素。
re.findall
这个函数是我在爬虫项目中用的最多的一个函数了,它可以把所有匹配的结果以列表的形式返回,而不是像match和search一样只匹配一个结果。我们来试一下:
st = 'www.baidu.com www.taobao.com'
result = re.findall(r'www\.(\w*)\.(com)', st)
print(result)
[('baidu', 'com'), ('taobao', 'com')]
re.finditer
这个函数和findall的功能一样。不同之处在于这个函数返回的结果是一个生成器,而生成器中的每一项是一个match对象,我们一起来看一下:
st = 'www.baidu.com www.taobao.com'
result = re.finditer(r'www\.(\w*)\.(com)', st)
print(result.__next__().group(0, 1, 2))
print(next(result).groups(2))
('www.baidu.com', 'baidu', 'com')
('taobao', 'com')
re.sub
这个函数是用来替换字符串的。可以将匹配的字符串替换成指定的字符串,我们来看一下:
st = 'www.111.com www.222.com'
result = re.sub(r'\d+', 'OK', st)
print(result)
结果:www.OK.com www.OK.com
我们的第二个参数除了可以是一个给定的字符串还可以是一个函数:
def toOK(matched):
value = matched.group()
return str(int(value)*2)
st = 'www.111.com www.222.com'
result = re.sub(r'\d+', toOK, st)
print(result)
结果:www.222.com www.444.com
好,我们今天的review就到这里了,你掌握了吗?对于正则你还知道哪些更高级的用法呢,留言告诉我吧。
python正则-re的使用的更多相关文章
- Python正则式的基本用法
Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...
- python 正则,常用正则表达式大全
Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号: 改符号开始 从 ...
- python 正则使用笔记
python正则使用笔记 def remove_br(content): """去除两边换行符""" content = content.r ...
- Python正则处理多行日志一例
正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...
- Python正则匹配字母大小写不敏感在读xml中的应用
需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...
- Python正则替换字符串函数re.sub用法示例(1)
本文实例讲述了Python正则替换字符串函数re.sub用法.分享给大家供大家参考,具体如下: python re.sub属于python正则的标准库,主要是的功能是用正则匹配要替换的字符串然后把它替 ...
- Python正则处理多行日志一例(可配置化)
正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...
- 认识python正则模块re
python正则模块re python中re中内置匹配.搜索.替换方法见博客---python附录-re.py模块源码(含re官方文档链接) 正则的应用是处理一些字符串,phthon的博文python ...
- python正则的中文处理(转)
匹配中文时,正则表达式规则和目标字串的编码格式必须相同 print sys.getdefaultencoding() text =u"#who#helloworld#a中文x#" ...
- Python正则简单实例分析
Python正则简单实例分析 本文实例讲述了Python正则简单用法.分享给大家供大家参考,具体如下: 悄悄打入公司内部UED的一个Python爱好者小众群,前两天一位牛人发了条消息: 小的测试题: ...
随机推荐
- UTM (Urchin Tracking Module) codes
UTM Codes are a great way to see the results of your offline marketing In today’s day and age, we ar ...
- Rails.cache相关知识
可能里面的一些知识已经不被大家使用了,但是作为学习,我想和大家分享一下个人关于Rails.cache的浅显的认识,望大家指教. 1.Rails.cache是什么 它是Rails中的缓存,拥有所有缓存的 ...
- spring 5.x 系列第18篇 —— 整合websocket (代码配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 项目模拟一个简单的群聊功能,为区分不同的聊 ...
- JavaWeb入门_模仿天猫整站Tmall_SSH实践项目
Tmall_SSH 技术栈 Struts2 + Hibernate + Spring + Jsp + Tomcat , 是 Java Web 入门非常好的练手项目 效果展示: 模仿天猫前台 模仿天猫后 ...
- String.format()
System.out.println(String.format("sftp DownloadDir is: %s and new is %s", "哈哈",& ...
- ES5_04_Array扩展
介绍什么是Array对象? # Array 对象用于在单个的变量中存储多个值 1. 创建 Array 对象的语法: 2. Array 对象属性 3. Array 对象方法 补充: 1. Array.p ...
- HDU 4059:The Boss on Mars(数学公式+容斥原理)
http://acm.hdu.edu.cn/showproblem.php?pid=4059 题意:给出一个n,求1~n里面与n互质的数的四次方的和是多少. 思路:不知道1~n的每个数的四次方的求和公 ...
- Redis在.net 环境下的使用
Redis概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括st ...
- java网络爬虫,乱码问题终于完美解决
第一次写爬虫,被乱码问题困扰两天,试了很多方法都不可以,今天随便一试,居然好了. 在获取网页时创建了一个缓冲字节输入流,问题就在这个流上,添加标红代码即可 BufferedReader in = nu ...
- Java 源码学习系列(三)——Integer
Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还 ...