该部分为中谷教育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'] >>>