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 ...
随机推荐
- LSD-FET430UIF与MSP-FET430UIF
成功的破解了没人研究的东西很有成就感!世界需要这样的人!!!LSD-FET430UIF与MSP-FET430UIF?什么是MSPF149?网上查了很多这方面的资料,都没有,最后凭借我阅读PDF的精神和 ...
- iOS中不透明度的查看
模拟器工具条 Debug-->Color Blended Layers 即中文显示下 调试 -->颜色混合层 绿色代表不透明部分,红色代表透明部分,红色越多对性能影响越大
- c 指针 及其位运算循环移动拔河比赛问题代码
week_2_day1_7.7 周一//用字符数组 来实现 字母大小写转换#include<stdio.h>void desc( char *a ,int n){ char *i ...
- 学习笔记-menusript控件中条目权限设置使用
在做一个小程序的时候,偶然发现了使用menusript控件做权限设置的方法,仅此标记,以供参考. 首先创建一个实例:testuseright.sln, 在项目文件里创建两个窗体:Form1.cs和us ...
- Oracle EBS-SQL (MRP-1):检查期间内计划完成的任务.sql
/*期间内车间任务下达记录数不包含配件任务*/ select WE.DESCRIPTION 任务说 ...
- ECO
ECO(生态环保的简写) 在与环保相关的概念和资料中,ECO 是ECOLOGICAL的缩写,用来表示生态环保的意思.与之相关产生了一些新的名词,尤其是在房地产楼书中常常被提及,如: ECO-HOME, ...
- [C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...
- 第一章 andriod studio 安装与环境搭建
原文 http://blog.csdn.net/zhanghefu/article/details/9286123 第一章 andriod studio 安装与环境搭建 一.Android Stu ...
- Hibernate 多表关联映射- 一对多关系映射(one-to-many)
Hibernage.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...
- kobox: key_proc.c -v1 怎样使用proc文件系统调试驱动
使用proc文件系统能够非常方便调试驱动.查看驱动中的一些数据 平台:TQ2440 系统版本号: root@ubuntu:/mnt/shared/kobox# uname -a Linux ubunt ...