拓展:正则表达式-元字符

该部分为中谷教育Python视频教程的学习笔记

>>> import re
>>> 
>>> r = r'^abc'
>>> 
>>> re.findall(r,'abc')
['abc']
>>> re.findall(r,'aeabc')
[]
>>> re.findall(r,'^abc')        #如果我们要匹配'^abc',结果却是一个空集。
[]
#在上节课中提到^号在行首的意义是^号后面的字符串必须是行首位置
#^号作为元字符处理并不是一个普通的符号
>>> re.findall(r,'^abc ^abc ^abc')
[]
#如果我们的字符串里包含了若干个^abc,那么应该如何编写正则表达式呢?
#可以利用反斜杠转义:\
>>> r = r'\^abc'
>>> re.findall(r,'^abc ^abc ^abc')
['^abc', '^abc', '^abc']
#那么这里的反斜杠\就是这节课要提到的元字符

\反斜杠
反斜杠后面可以加不同的字符以表示不同特殊意义
也可以用于取消所有的元字符:\[或者\\ 
\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_]

>>> r = r'\d'
>>> re.findall(r,'123456784566487445')
['1', '2', '3', '4', '5', '6', '7', '8', '4', '5', '6', '6', '4', '8', '7', '4', '4', '5']
>>> r = r'\w'
>>> re.findall(r,'AdministratorSever')
['A', 'd', 'm', 'i', 'n', 'i', 's', 't', 'r', 'a', 't', 'o', 'r', 'S', 'e', 'v', 'e', 'r']
>>> r = r'\s'
>>> re.findall(r,'a b c d ')
[' ', ' ', ' ', ' ']
>>> r = r'\S'
>>> re.findall(r,'a b c d ')
['a', 'b', 'c', 'd']

重复:正则表达式第一个功能是能够匹配不定长的字符集,另一个功能就是可以指定正则表达式的一部分的重复次数

如北京电话号码格式为区号-电话号码如010-12345678
那么如何用正则表达式来匹配:
>>> r = r'^010-\d\d\d\d\d\d\d\d'    #有8个数字,因此写8个\d,如果数字多呢?如果要匹配128位的密钥?
>>> re.findall(r,'010-87654321')
['010-87654321']
>>> re.findall(r,'010-8765432')
[]
>>> r = r'^010-\d{8}' #{8}表示把前面的\d重复8次
>>> re.findall(r,'010-87654321')
['010-87654321']
>>> r = r'^010-a{8}' #{8}表示把前面的a重复8次
>>> re.findall(r,'010-aaaaaaaa')
['010-aaaaaaaa']
>>>

*星号
指定前一个字符可以被匹配零次或者更多次,而不是只有一次。匹配引擎会试着重复尽可能多的次数(不超过整数界定范围 20亿)
a[acd]*b  ---- 'abcbd'

>>> r = r'ab*'    #*号表示把b重复0次或者更多次
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'abbbbbbbbbbbbbbb')
['abbbbbbbbbbbbbbb']

+号
表示匹配一次或更多次
注意*和+之间的不同,*匹配零或多次,所以可以根本就不出现,而+则要求至少出现一次。

>>> r = r'ab+'
>>> re.findall(r,'a')
[]
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'abbbb')
['abbbb']
>>>

?号
匹配一次或零次,你可以认为它用于标识某事物是可选的。

#以电话号码为例,匹配电话号码有时候有人会写010-12345678,
#有些人会写01012345678那么这个-号是可选的,
#如何处理?看看用*号和用?号的区别
>>> r = r'^010-\d{8}$'
>>> r = r'^010-*\d{8}$'
>>> 
>>> re.findall(r,'01012345678')
['01012345678']
>>> re.findall(r,'010--12345678')
['010--12345678']
>>> r = r'^010-?\d{8}$'
>>> re.findall(r,'010--12345678')
[]
>>> re.findall(r,'010-12345678')
['010-12345678']
>>> re.findall(r,'01012345678')
['01012345678']
>>>

贪婪模式和非贪婪模式:

>>> r = r'ab+'
>>> re.findall(r,'abbbbbbb')        #贪婪模式,会做最大匹配
['abbbbbbb']
>>> r = r'ab+?'
>>> re.findall(r,'abbbbbbb')        #非贪婪模式,做最小匹配
['ab']
>>>

 

{m,n} 
其中m和n是十进制整数。该限定字符的意思是至少有m个重复,至多到n个重复。a/{1,3}b
忽略m会认为下边界是0,而忽略n的结果将是上边界为无穷大(实际上是20亿)
{0,}等同于*,{1,}等同于+,而{0,1}等同于?。如果就可以,最好使用*,+或者?号

>>> r = r'a{1,3}'
>>> re.findall(r,'a')
['a']
>>> re.findall(r,'b')
[]
>>> re.findall(r,'aa')
['aa']
>>> re.findall(r,'aaa')
['aaa']
>>> re.findall(r,'aaaa')
['aaa', 'a']
>>> re.findall(r,'aaaaaaaaaaaaa')
['aaa', 'aaa', 'aaa', 'aaa', 'a']
>>>
posted @ 2014-03-03 18:00  小丑戌  阅读(421)  评论(0编辑  收藏  举报