您的位置:首页 > 编程语言 > Python开发

python 正则表达式 学习笔记(不断补充ing)

2015-09-01 15:22 821 查看
本文参考了以下博客,感谢众位大神的分享!
http://www.oschina.net/question/12_9507http://www.crifan.com/python_re_sub_detailed_introduction/ http://blog.csdn.net/lxcnn/article/details/4146148http://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声明需要处理的数量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: