【笔记】Python基础七:正则表达式re模块
一,介绍
正则表达式(RE)是一种小型的,高度专业化的编程语言,在python中它内嵌在python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由C编写的匹配引擎执行。
字符匹配(普通字符,元字符):
1 普通字符:大多数字符和字母都会和自身匹配
>>> re.findall('alex','yuanaleSxalexwupeiqi')
['alex']
2 元字符:. ^ $ * + ? { } [ ] | ( ) \
二,元字符
(一)点.通配符,代替除了换行符\n以外的任意一个字符
>>> import re
>>> re.findall("alex","sdffalexjj")
['alex']
>>> re.findall("a..x","sdffalexjj")
['alex']
>>> re.findall("a...x","sdffalexjj")
[]
(二)尖角号^,表示以后面的字符串开头;$符,表示以前面的字符串结尾。
>>> re.findall("^a..x","asdffalexjj")
[]
>>> re.findall("^a..x","asdxfalexjj")
['asdx']
>>> re.findall("a..x$","asdxfa22x")
['a22x']
(三)重复符号,* + ? { }
1,*是重复紧挨着的字符,从0次到无穷次
>>> re.findall("alex*","asdxfale")
['ale']
2,+是1到无穷次,如果没有(0次)就匹配不上
>>> re.findall("alex+","asdxfale")
[]
>>> re.findall("alex+","asdxfalexxx")
['alexxx']
3,?是0或者1次
>>> re.findall("alex?","asdxfalexxx")
['alex']
>>> re.findall("alex?","asdxfale")
['ale']
4,{}自定义范围 {0,}==* {1,}==+ {0,1}==? {6}==重复6次 {1,6}重复1到6次
>>> re.findall("alex{6}","asdxfalexxxxxx")
['alexxxxxx']
>>> re.findall("alex{6}","asdxfalex")
[]
>>> re.findall("alex{0,1}","asdxfalex")
['alex']
>>> re.findall("alex{0,1}","asdxfale")
['ale']
注意*,+,?等都是贪婪匹配,后面加?号使其变成惰性匹配
>>> re.findall('abc*?','abcccccc')
['ab']
>>> re.findall('abc*','abcccccc')
['abcccccc']
>>> re.findall('abc+?','abcccccc')
['abc']
(四)字符集[]
实现或的逻辑
>>> re.findall('x[yz]','xyuuxzuu')
['xy', 'xz']
>>> re.findall('x[yz]p','xypuuxzuu')
['xyp']
>>> re.findall('x[y,z]p','xypuuxzuux,p')
['xyp', 'x,p']
[]内只有三个字符例外
1,-表示范围
>>> re.findall('x[a-z]','xypuuxzuux,p')
['xy', 'xz']
>>> re.findall('x[a-z]*','xypuuxzuux')
['xypuuxzuux']
>>> re.findall('x[a-z]*','xypuuxzuux9n')
['xypuuxzuux']
2,^非
>>> re.findall('x[^a-z]','x12')
['x1']
>>> re.findall('x[^a-z]','xy')
[]
>>> re.findall("\([^()]*\)","12+(34*6+2-5*(2-1))")
['(2-1)']
3,\ 后面跟元字符去除特殊功能,比如\.
后面跟普通字符实现特殊功能,比如\d
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
>>> re.findall("\d","12+(34*6+2-5*(2-1))")
['', '', '', '', '', '', '', '', '']
>>> re.findall("\d+","12+(34*6+2-5*(2-1))")
['', '', '', '', '', '', '']
>>> re.findall("[0-9]+","12+(34*6+2-5*(2-1))")
['', '', '', '', '', '', '']
>>> re.findall("\D+","12+(34*6+2-5*(2-1))")
['+(', '*', '+', '-', '*(', '-', '))']
>>> re.findall("\D+","hello world")
['hello world']
>>> re.findall("\s+","hello world")
[' ']
>>> re.findall("\S+","hello world")
['hello', 'world']
>>> re.findall("\w+","hello_world")
['hello_world']
>>> re.findall("\W+","~!@#$%^&*()")
['~!@#$%^&*()']
>>> re.findall("www\.baidu","www.baidu")
['www.baidu']
\b的用法讨论。re.findall("I\b","I am ooo"),这里面python解释器会识别出\b,并处理后交给re模块,re模块收到的不再是\b,于是产生问题。
解决方法1:使用r(raw string原生字符串)re.findall(r"I\b","I am ooo")
解决方法2:使用\\,由python解释器处理一次,去掉一个\,传给re模块就变成\b,re.findall("I\\b","I am ooo")
举例:找出"c\l",反推re模块接收为"c\\l",反推python解释器接收为"c\\\\l",最后re.findall("c\\\\l","I am oc\lo")
>>> re.findall("c\\\\l","I am oc\lo")
['c\\l']
(五)管道符|
|之前是一部分,|之后是一部分,两者是或的关系
>>> re.findall("ka|b","I am ka|b")
['ka', 'b']
(六)分组介绍
1,匿名分组使用()
>>> re.findall("(abc)+","I am abcd")
['abc']
注意:如果使用()分组,findall会优先显示匹配到的分组()里面的内容,而不是匹配的全部内容
如果就想要www.baidu.com完整匹配,需要在括号里加入?:
>>> re.findall("www\.(baidu|163)\.com","dfsgfwww.baidu.com112")
['baidu']
>>> re.findall("www\.(?:baidu|163)\.com","dfsgfwww.baidu.com112")
['www.baidu.com']
利用“优先显示匹配到的结果”解释下面的的现象
>>> re.findall("(abc)+","I am abcabcabc")
['abc']
上面实际把abc作为一个整体匹配,匹配到1次,结果是abcabcabc,但是只显示1个abc。如果想要全部显示,则需要使用上面的?:,如下:
>>> re.findall("(?:abc)+","I am abcabcabc")
['abcabcabc']
这种整体分组使用括号()匹配和单个字符匹配abc+是不一样的,如下abc+匹配到了3次而不是像上面分组的1次
>>> re.findall("abc+","I am abcabcabc")
['abc', 'abc', 'abc']
同理,分组的匹配出现多次的情况:
>>> re.findall("(abc)+","I am abcabc111abc")
['abc', 'abc']
2,命名分组:?P<name>对匹配没有任何影响,只是起了一个分组的名字叫name,而name作为group方法调用的参数。实际对匹配起作用的仍然是[a-z]+)\d+
>>> re.search("(?P<name>[a-z]+)\d+","alex36wusir34xialv33").group()
'alex36'
>>> re.search("(?P<name>[a-z]+)\d+","alex36wusir34xialv33").group("name")
'alex'
>>> re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36wusir34xialv33").group("age")
''
三,方法
1,findall,返回所有满足匹配条件的结果,放在列表里
2,serach,在字符串内查找模式匹配,找到第一个然后返回一个对象。通过调用group()方法得到匹配的字符串,如果字符串没有匹配返回None
3,match,只会在开始处进行匹配
>>> re.match("(\d+)","alex36wusir34xialv33")
>>> re.match("(\d+)","56alex36wusir34xialv33")
<_sre.SRE_Match object; span=(0, 2), match=''>
>>> re.match("(\d+)","56alex36wusir34xialv33").group()
''
4,split,分割函数
>>> re.split("[ |]","hello abc|def")
['hello', 'abc', 'def']
>>> re.split("[ab]","asdabcd")
['', 'sd', '', 'cd']
>>> re.split("[ab]","abc")
['', '', 'c']
5,sub,替换函数,4个参数:1:模式,2:替换为字符,3:搜索字符串,4:替换次数
>>> re.sub("\d+","A","J12abc234ffg55")
'JAabcAffgA'
>>> re.sub("\d","A","J12abc234ffg55")
'JAAabcAAAffgAA'
>>> re.sub("\d","A","J12abc234ffg55",4)
'JAAabcAA4ffg55'
>>> re.subn("\d","A","J12abc234ffg55")
('JAAabcAAAffgAA', 7)
6,compile,模式先编译好,以后就可以直接调用。好处是写一次可以使用多次提高效率。
>>> com=re.compile("\d+")
>>> com.findall("fjlkdad234hfjksd3421")
['', '']
>>> com.findall("444adf555")
['', '']
7,finditer,返回的是迭代器对象,不再是列表。好处和迭代器是一样的。
>>> ret=re.finditer("\d","sdfds123fr")
>>> next(ret).group()
''
>>> next(ret).group()
''
参考:http://www.cnblogs.com/yuanchenqi/articles/5732581.html
【笔记】Python基础七:正则表达式re模块的更多相关文章
- python基础之正则表达式 re模块
内容梗概: 1. 正则表达式 2. re模块的使⽤ 3. 一堆练习正则表达式是对字符串串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进行匹配和过滤.使用正则的优缺点: 优点: 灵活,功能性强, ...
- 十七. Python基础(17)--正则表达式
十七. Python基础(17)--正则表达式 1 ● 正则表达式 定义: Regular expressions are sets of symbols that you can use to cr ...
- Java基础七-正则表达式
Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...
- Python学习笔记—Python基础1 介绍、发展史、安装、基本语法
第一周学习笔记: 一.Python介绍 1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- Python基础之 正则表达式指南
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- Python基础(十)-模块
模块初识 一般把不同功能代码放到不同py文件,一个py文件就是一个模块 三种模块库: 1.Python标准库 2.第三方库 3.自定义库 导入模块:import 库名 (Python解释器只认识执行文 ...
- python基础(10)--模块
模块(module) 模块,用一坨代码实现了某个功能的代码集合 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来 ...
- Python基础(12)--模块
本文地址:http://www.cnblogs.com/archimedes/p/python-modules.html,转载请注明源地址. 模块简介 如果你退出 Python 解释器重新进入,以前创 ...
- python基础之正则表达式
正则表达式语法 正则表达式 (或 RE) 指定一组字符串匹配它;在此模块中的功能让您检查一下,如果一个特定的字符串匹配给定的正则表达式 (或给定的正则表达式匹配特定的字符串,可归结为同一件事). 正则 ...
- python基础之正则表达式。
简介 就其本质而言,正则表达式是内嵌在python内,由re模块实现,小型的专业化语言,最后由c写的匹配引擎执行.正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来 ...
随机推荐
- C#中CefSharp的简单使用
1. 创建32位winform项目 必须指定32位或64位 这里使用32位 2. 下载CefSharp相关文件 3. 复制CefSharp相关文件到项目debug目录并添加引用 https://blo ...
- Web高级 网站安全
1. SQL注入 虽然现在SQL注入发生的情况总的来说越来越少,还是提二句.关于什么是SQL注入大家都知道就不多说了. 1.1 原理 我们在做前端页面的时候,少不了会又各种输入框,然后通过GET或者P ...
- ORACLE 数据库使用正则表达式重新计算指定位置的数字为新的数字
昨天工作中遇到这个问题: 有一个这样的字符串expression变量,里面可能存储的值类似于以下[Index_CivilWork,0]*(1+[Y10814,1])/[Y10674,1] [300,1 ...
- Java程序的第一次作业
- Promise.all处理多个异步请求
一个前台页面需要请求2个rest接口获取数据,一个用于解析文件获取列名,一个查询数据库获得列值. 有很低的概率页面显示为空,刷新可能就有显示了. 使用Promise.all就解决了上面的问题,2部分数 ...
- python笔记(三)---文件读写、修改文件内容、处理json、函数
文件读写(一) #r 只读,打开文件不存在的话,会报错 #w 只写,会清空原来文件的内容 #a 追加写,不会请求,打开的文件不存在的话,也会帮你新建的一个文件 print(f.read()) #获取到 ...
- [UE4]插值interp
插值 在两个数之间补充一些数,让过渡变得更自然. UE4引擎提供的插值 一.CInterp To:颜色(Color)插值.C:Color,颜色. 二.FInterp To.FInterp To Con ...
- Galaxy2D游戏引擎常见问题解答
◆Galaxy2D游戏引擎开源吗? Galaxy2D游戏引擎不开源. ◆Galaxy2D相对HGE有何优点? Galaxy2D相对HGE有以下优点: (1)自带音频播放功能,HGE ...
- jquery---筛选总结
jQuery中筛选这块内容较多,就简单的说明一下说用方法和能有什么样效果,就不弄案例来说明了: 第一类:过滤 1.eq(index|-index) $("p").eq(1).css ...
- kolla queens on centos7.5 -all in one
目录 环境准备 开始配置 快照,快照,快照 pull镜像并部署 登录配置OpenStack 环境准备 我这里用workstation创建了一个虚拟机,安装centos7.5 mini系统,这台虚拟机上 ...