首先说明一下字符集合设定的方法。由一对方括号括起来的字符,表明一个字符集合,能够匹配包含在其中的任意一个字符。比如 [abc123],表明字符’a’ ‘b’ ‘c’ ‘1’ ‘2’ ‘3’都符合它的要求。可以被匹配。
在’[‘ ‘]’中还可以通过 ’-‘ 减号来指定一个字符集合的范围,比如可以用[a-zA-Z]来指定所以英文字母的大小写,因为英文字母是按照从小到大的顺序来排的。你不可以把大小的顺序颠倒了,比如写成[z-a]就不对了。
如果在’[‘ ‘]’里面的开头写一个 ‘^’ 号,则表示取非,即在括号里的字符都不匹配。如[^a-zA-Z]表明不匹配所有英文字母。但是如果 ‘^’不在开头,则它就不再是表示取非,而表示其本身,如[a-z^A-Z]表明匹配所有的英文字母和字符’^’。
将两个规则并列起来,以‘|’连接,表示只要满足其中之一就可以匹配。比如
[a-zA-Z]|[0-9] 表示满足数字或字母就可以匹配,这个规则等价于 [a-zA-Z0-9]
注意:关于’|’要注意两点:
例
>>> s = ‘I have a dog , I have a cat’ >>> re.findall( r’I have a (?:dog|cat)’ , s ) ['I have a dog', 'I have a cat'] #正如我们所要的
下面再看看不用无捕获组会是什么后果:
>>> re.findall( r’I have a dog|cat’ , s ) ['I have a dog', 'cat'] #它将’I have a dog’ 和’cat’当成两个规则了
至于无捕获组的使用,后面将仔细说明。这里先跳过。
匹配除换行符’\n’外的所有字符。如果使用了’S’选项,匹配包括’\n’的所有字符。
例:
>>> s=’123 \n456 \n789’ >>> findall(r‘.+’,s) ['123', '456', '789'] >>> re.findall(r‘.+’ , s , re.S) ['123\n456\n789']
注意’^’不能在‘[ ]’中,否则含意就发生变化,具体请看上面的’[‘ ‘]’说明。 在多行模式下,它们可以匹配每一行的行首和行尾。具体请看后面compile函数说明的’M’选项部分
这是一个以’\’开头的转义字符,’\d’表示匹配一个数字,即等价于[0-9]
这个是上面的反集,即匹配一个非数字的字符,等价于[^0-9]。注意它们的大小写。下面我们还将看到Python的正则规则中很多转义字符的大小写形式,代表互补的关系。这样很好记。
匹配所有的英文字母和数字,即等价于[a-zA-Z0-9]。
即’\w’的补集,等价于[^a-zA-Z0-9]。
即匹配空格符、制表符、回车符等表示分隔意义的字符,它等价于[ \t\r\n\f\v]。(注意最前面有个空格)
即间隔符的补集,等价于[^ \t\r\n\f\v]
匹配字符串的开头。它和’^’的区别是,’\A’只匹配整个字符串的开头,即使在’M’模式下,它也不会匹配其它行的很首。
匹配字符串的结尾。它和’$’的区别是,’\Z’只匹配整个字符串的结尾,即使在’M’模式下,它也不会匹配其它各行的行尾。
例:
>>> s= '12 34\n56 78\n90' >>> re.findall( r'^\d+' , s , re.M ) #匹配位于行首的数字 ['12', '56', '90'] >>> re.findall( r’\A\d+’, s , re.M ) #匹配位于字符串开头的数字 ['12'] >>> re.findall( r'\d+$' , s , re.M ) #匹配位于行尾的数字 ['34', '78', '90'] >>> re.findall( r’\d+\Z’ , s , re.M ) #匹配位于字符串尾的数字 ['90']
它匹配一个单词的边界,比如空格等,不过它是一个‘0’长度字符,它匹配完的字符串不会包括那个分界的字符。而如果用’\s’来匹配的话,则匹配出的字符串中会包含那个分界符。
例:
>>> s = 'abc abcde bc bcd' >>> re.findall( r’\bbc\b’ , s ) #匹配一个单独的单词 ‘bc’ ,而当它是其它单词的一部分的时候不匹配 ['bc'] #只找到了那个单独的’bc’ >>> re.findall( r’\sbc\s’ , s ) #匹配一个单独的单词 ‘bc’ [' bc '] #只找到那个单独的’bc’,不过注意前后有两个空格,可能有点看不清楚
和’\b’相反,它只匹配非边界的字符。它同样是个0长度字符。
接上例:
>>> re.findall( r’\Bbc\w+’ , s ) #匹配包含’bc’但不以’bc’为开头的单词 ['bcde'] #成功匹配了’abcde’中的’bcde’,而没有匹配’bcd’
当你要将一部分规则作为一个整体对它进行某些操作,比如指定其重复次数时,你需要将这部分规则用’(?:’ ‘)’把它包围起来,而不能仅仅只用一对括号,那样将得到绝对出人意料的结果。
例:匹配字符串中重复的’ab’
>>> s=’ababab abbabb aabaab’ >>> re.findall( r’\b(?:ab)+\b’ , s ) ['ababab']
如果仅使用一对括号,看看会是什么结果:
>>> re.findall( r’\b(ab)+\b’ , s ) ['ab']
这是因为如果只使用一对括号,那么这就成为了一个组(group)。组的使用比较复杂,将在后面详细讲解。
Python允许你在正则表达式中写入注释,在’(?#’ ‘)’之间的内容将被忽略。
Python的正则式可以指定一些选项,这个选项可以写在findall或compile的参数中,也可以写在正则式里,成为正则式的一部分。这在某些情况下会便利一些。具体的选项含义请看后面的compile函数的说明。
此处编译选项’i’ 等价于IGNORECASE ,L 等价于 LOCAL ,m 等价于 MULTILINE ,s 等价于 DOTALL ,u 等价于UNICODE , x 等价于 VERBOSE 。
请注意它们的大小写。在使用时可以只指定一部分,比如只指定忽略大小写,可写为 ‘(?i)’,要同时忽略大小写并使用多行模式,可以写为 ‘(?im)’。
另外要注意选项的有效范围是整条规则,即写在规则的任何地方,选项都会对全部整条正则式有效。