【笔记】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)描述了一种字符串匹配的模式,可以用来 ...
随机推荐
- python各种类型日期转换大全
最近写python做各种日期转换比较多,顺便总结一下,先上张图: # 根据字符串类型转日期 返回值类型<class 'time.struct_time'> st_time = time.s ...
- enable-ssh-key-logon-disable-password-password-less-logon-centos/
cat ~/.ssh/id_rsa.pub | ssh root@destination_server_address "cat >> ~/.ssh/authorized_key ...
- SpringBoot与SpringCloud的版本对应详细版
大版本对应: Spring Boot Spring Cloud 1.2.x Angel版本 1.3.x Brixton版本 1.4.x stripes Camden版本 1.5.x Dalston版本 ...
- sudo 取消密码
通常我们并不以root身份登录,但是当我们执行某些命令 (command)时需要用到root权限,我们通常都是用"sudo command"来执行command.由于使用Ubunt ...
- microsoft.jet.oledb.4.0 未注册
64位系统已经不支持4.0 解决办法 1.下载 ACE2010的驱动,64位的. http://www.microsoft.com/downloads/zh-cn/details.aspx?famil ...
- 记一次解决cmd中执行java提示"找不到或无法加载主类"的问题
今天遇到一个问题:在cmd命令行中,用javac编译java文件可以成功,但是用java执行却提示“找不到或无法加载主类”.现将该问题的原因以及解决办法记录一下. 先理解一下系统变量path和clas ...
- Centos 7.5下搭建SVN源代码服务器
1.先查看是否存在svn,没有就需要安装svn svnserve --version #查看svn版本号 which svn #查看svn程序所在目录 yum install subversion - ...
- Delphi 7启动后提示Unable to rename delphi32.dro的解决办法
在Win10 64 上安装完Delphi 7,每次打开报错: Unable to rename 'C:\Program Files (x86)\Borland\Delphi7\Bin\delphi32 ...
- RAND函数和SRAND函数
首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include<stdlib.h&g ...
- js实现输入某串数字,构建完全二叉树,并判断是否为二叉搜索树
思路:若为二叉搜索树,则中序遍历为递增的 let arr = [15,8,16,6,10];let pindex = [];function Node(){ this.root = null; thi ...