python 正则表达式 学习笔记(不断补充ing)
本文参考了以下博客,感谢众位大神的分享!
http://www.oschina.net/question/12_9507 和 http://www.crifan.com/python_re_sub_detailed_introduction/
http://blog.csdn.net/lxcnn/article/details/4146148 和 http://www.cnblogs.com/-ShiL/archive/2012/04/06/Star201204061009.html
正则表达式是可以匹配文本片段的模式。python中使用强大的re模块对正则表达式进行支持。
1. 常用通配符
| 符号 | 说明 |
| . | 匹配除换行符以外的任意字符 |
| \w | 匹配字母或数字或下划线或汉字 |
| \s | 匹配任意的空白符 |
| \d | 匹配数字 |
| \b | 匹配单词的开始或结束 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
2. 特殊字符进行转义
如果在正则表达式中想要把特殊字符(如上面的常用通配符)作为普通字符使用,就使用\对它们进行转义。在python的re模块中,需要用\\进行转义;如果不使用双斜线,可以使用原始字符串,这时只要用一个\即可,例如r'python\.org'。
3. 字符集
可以使用中括号[]括住字符串来创建字符集。字符集可以匹配它所包括的任意字符,如[a-z]能够匹配字母a到z的任意一个字符,还可以将范围联合起来[a-zA-Z0-9]能匹配任意大小写字母和数字(字符集只能匹配一个这样的字符)。
4. 选择符与子模式
使用|可以匹配多个模式中的一种,例如'python|perl'表示匹配字符串'python'或者'perl'。在使用|时,要注意可选模式的顺序,程序是从左向右匹配可选模式,一旦匹配左边的模式便不会考察右边的模式了。
可以使用()来指定子模式,可以在子模式中进行模式选择,还可以指定子模式的重复次数。例如,'p(ython|erl)',r'(www\.)?'。
5. 常用限定符
限定符用来限定前面字符或者子模式出现的数量。
| 符号 | 说明 |
| * | 重复零次或更多次 |
| + | 重复一次或更多次 |
| ? | 重复零次或一次 |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| {n,m} | 重复n到m次 |
6. 反义
有时需要查找不属于某个能简单定义的字符类的字符。例如,可以在开头使用^字符,[^abc]可以匹配除a,b,c之外的任意字符,\S+匹配不包含空白符的字符串。
| 符号 | 说明 |
| \W | 匹配任意不是字母或数字或下划线或汉字的字符 |
| \S | 匹配任意不是空白符的字符 |
| \D | 匹配任意非数字的字符 |
| \B | 匹配不是单词的开始或结束的位置 |
| [^x] | 匹配除了x以外的任意字符 |
| [^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
7. 捕获组(capture group)
捕获组就是把正则表达式中子模式匹配的内容,保存到内存中以数字编号或显示命名的组里,方便后面引用。这种引用既可以在正则表达式内部,也可以在正则表达式外部。
捕获组有两种形式,一种是普通捕获组,另一种是命名捕获组,通常所说的捕获组指的是普通捕获组。语法如下:
普通捕获组:(Expression)
命名捕获组:(?<name>Expression)
7.1 捕获组的编号规则
编号规则指的是以数字为捕获组进行编号的规则,在普通捕获组或命名捕获组单独出现的正则表达式中,编号规则比较清晰,在普通捕获组与命名捕获组混合出现的正则表达式中,捕获组的编号规则稍显复杂。编号为0的捕获组是指正则表达式整体。
7.1.1 普通捕获组编号规则
如果没有显式为捕获组命名,即没有使用命名捕获组,那么需要按数字顺序来访问所有捕获组。在只有普通捕获组的情况下,捕获组的编号是按照“(”出现的顺序,从左到右,从1开始进行编号的 。例如,(\d{4})-(\d{2}-(\d\d)),其中1号为(\d{4}),2号为(\d{2}-(\d\d)),3号为(\d\d)。
7.1.2 命名捕获组编号规则
命名捕获组通过显式命名,可以通过组名方便的访问到指定的组,而不需要去一个个的数编号,同时避免了在正则表达式扩展过程中,捕获组的增加或减少对引用结果导致的不可控。不过容易忽略的是,命名捕获组也参与了编号的,在只有命名捕获组的情况下,捕获组的编号也是按照“(”出现的顺序,从左到右,从1开始进行编号的 。
7.1.3 混合编号
当一个正则表达式中,普通捕获组与命名捕获组混合出现时,捕获组的编号规则稍显复杂。对于其中的命名捕获组,随时都可以通过组名进行访问,而对于普通捕获组,则只能通过确定其编号后进行访问。
混合方式的捕获组编号,首先按照普通捕获组中“(”出现的先后顺序,从左到右,从1开始进行编号,当普通捕获组编号完成后,再按命名捕获组中“(”出现的先后顺序,从左到右,接着普通捕获组的编号值继续进行编号。也就是先忽略命名捕获组,对普通捕获组进行编号,当普通捕获组完成编号后,再对命名捕获组进行编号。
7.2 反向引用
正则表达式中,对前面捕获组捕获的内容进行引用,称为反向引用。
捕获组(Expression)在匹配成功时,会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用方式,引用这个局部变量的值。一个捕获组(Expression)在匹配成功之前,它的内容可以是不确定的,一旦匹配成功,它的内容就确定了,反向引用的内容也就是确定的了。
反向引用必然要与捕获组一同使用的,如果没有捕获组,而使用了反向引用的语法,不同语言的处理方式不一致,有的语言会抛异常,有的语言会当作普通的转义处理。
具体例子见:http://www.cnblogs.com/-ShiL/archive/2012/04/06/Star201204061009.html
8. 贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的 字符。以这个表达式为例:a.*b,它将会匹配最长的以 a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的 字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提 下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结 束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另 一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。
| 符号 | 说明 |
| *? | 重复任意次,但尽可能少重复 |
| +? | 重复1次或更多次,但尽可能少重复 |
| ?? | 重复0次或1次,但尽可能少重复 |
| {n,m} | 重复n次到m次,但尽可能少重复 |
| {n,}? | 重复n次以上,但尽可能少重复 |
*re模块之re.sub
re模块包含一些有用的操作正则表达式的函数。re.sub的作用是使用给定的替换内容将匹配模式的子字符串替换掉,相比较字符串的replace方法,re.sub可以进行更灵活的字符串搜索与替换。
re.sub(pattern, repl, string, count=0, flags=0)
pattern,repl,string为必选参数,count,flags为可选参数
1. pattern
表示正则中的模式字符串,其中反斜杠加数字(\N),则对应着捕获组。
2. repl
表示替换内容,repl可以是字符串,也可以是函数。
当repl是函数时,使用规则如下(摘自python 2.7.10 官方文档)
If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.
For example:
def dashrepl(matchobj):
if matchobj.group(0)=='-':
return ' '
else:
return '-' re.sub('-{1,2}', dashrepl,'pro----gram-files')
运行结果如下:

其中group()函数用来提取匹配字符串中一个或多个子匹配字符串。
如果group()函数中有一个参数,那么函数返回结果为一个字符串;如果这里有多个参数,那么函数返回结果是一个元组,元组中每一项对应于group()中的一个参数。如果没有参数,则group使用默认参数0,即group(0),函数结果返回整个匹配正则表达式的字符串。如果参数为负数或者超过了pattern中定义的子模式组数,则会报出IndexError的错误。
例如:

3. string
表示要被处理的字符串,即在该字符串中匹配正则表达式并进行替换。
4. count
count 是模式匹配後替换的最大次数。count 必须是非负整数,缺省值是 0 表示替换所有的匹配。假如对于匹配到的内容,只处理其中的一部分,则可以用count声明需要处理的数量。
python 正则表达式 学习笔记(不断补充ing)的更多相关文章
- Python 正则表达式学习笔记
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- 7.Python 正则表达式学习笔记
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- Python正则表达式 学习笔记
python第一个正则表达式 1. import re : python正则表达式模块 2. 第一个正则表达式 re.compile(r'imooc') pattern.match('imooc py ...
- Python正则表达式学习笔记
[] 字符类,只要匹配里面的任意字符,都算匹配 . 元字符,可以匹配除换行符之外的所有字符 大小写敏感,但是可以关闭 \d 可以匹配0-9中的任意数字 {3}大括号里面的数字,边上前面一个字符匹配的 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Python正则表达式学习摘要及资料
摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...
- Python Click 学习笔记(转)
原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...
- JavaScript正则表达式学习笔记(二) - 打怪升级
本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- USB2.0的基本学习
SB2.0是在1.0的基础上于2000年提出来的,在1.0的基础上曾加了480Mbps的数据传输率.USB2.0具有以下的优点: 1.每个USB系统中有一个主机,通过级联的方式连接多个外部设备,最多可 ...
- de4dot命令 v2.0.3.3405
de4dot v2.0.3.3405 Copyright (C) 2011-2013 [email]de4dot@gmail.com[/email] Latest version and source ...
- 用Express搭建 blog (一)
Info 公司马上要举行 hack day 了,这次决定和小伙伴用 Express 作为框架来搭建我们的应用,所以昨天搭出来UI后,今天开始系统的学习下 Express. Start 首先是expre ...
- break point
结论: 当有break point时,$m_H(N)=O(N^{k-1})$ bounding function:当break point = k,时成长函数$m_H(N)$的上限这样可以忽略假设集的 ...
- Python实现CGI环境
要想安装Python的CGI环境,就继续往下看吧. 首先,要确定apache服务可以使用CGI服务. 打开apache的配置文件,设置如图. 在启动的apache服务的系统目录下,创建目录如/User ...
- Robotium双client測试框架
互联网的本质就是信息交换.移动互联网更是如此, 所以很多移动互联网的服务类应用中有着身份地位不同的两种用户(比如:交易中的买家和卖家, 教学中的老师和学生, 打车中的车主和乘客).近期的工作是给公司的 ...
- [Oracle] - 性能优化工具(3) - ADDM
ADDM 通过检查和分析AWR获取的数据来推断Oracle数据库中可能的问题.并给出优化建议. 获取ADDM的方法例如以下: @?/rdbms/admin/addmrpt.sql 以下能够看一个样例: ...
- SQL 数据类型、约束、索引及视图
一.数据类型:整数:int,bigint,smallint小数:float,real,decimal(长度,精度),numeric(长度,精度)字符:char(n),varchar(n) 8000英文 ...
- Asp.Net之三层架构
三层架构之理论: 通常意义上讲的三层架构就是将整个项目应用划分为:表现层(UI),业务逻辑层(BLL),数据访问层(DAL).与传统的二层架构的区别在于在用户界面(UI)和数据库服务器之间,添加中间层 ...
- 解决windows下Eclipse连接远程Hadoop报错
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.N ...