Python语言的正则表达式功能由标准包re提供。利用正则表达式可以较容易地实现许多复杂字符串操作。
Python正则表达式采用字符串字面量的形式描述(即引号括起的字符 序列)。从Python语言的角度看它们就是普通的字符串,但在用于re包提供的一些特殊操作时,一个具有正则表达式形式的字符串代表一个字符串模式,描述了一个特定的字符串集合。这类操作就是re包提供的正则表达式匹配操作。
首先介绍原始字符串(raw string)的概念。原始字符串是在Python里书写字符串文字量的一种形式,这种文字量的值和普通文字量一样,就是str类型的字符串对象。
原始字符串的形式在普通字符串文字量前加r或R前缀,例如:
R"abcdefg" r"C:\courses\python\progs"
原始字符串只有一点特殊,就是其中的反斜线字符“\”不作为转义符,在相应字符串对象(str对象)里原样保留。但位于单 / 双引号前的反斜线符号仍作为转义符。
Python语言引入原始字符串只是为了使一些字符串文字量的写法略微简单。例如,描述Windows文件路径的原始字符串 r"C:\courses\python\progs",如果用普通文字量的形式,应该写为“C:\\courses\\python\\progs”,其中的反斜线需要双写,比较麻烦。
正则表达式包re规定了一组特殊字符,称为元字符。在匹配字符串时,它们起着特殊的作用。元字符一共有14个:
. ^ $ * + ? \ | { } [ ] ( )
应该注意的是,在(普通)字符串里,这些字符都是普通字符(“\”除外),只有在把字符串作为正则表达式,用于re包提供的一些特殊操作时,这些字符才有特殊意义。下面将把作为正则表达式使用的串称为模式串,将非特殊字符称为常规字符,它们是描述正则表达式的基础。
首先介绍re包提供的几个操作。下面的函数中,参数表里的pattern表示模式串(描述正则表达式的字符串),string表示被处理的字符串,repl表示替换串。
示例:
r1 = re.compile("abc") # re.compile('abc')
re.search(r1, "aaabcbcbabcb") #
re.match(r1, "aaabcbcbabcb") # None
re.findall("abc", "aaabcbcbabcb") # ['abc', 'abc']
实际中经常需要用到一个模式的重复匹配,可能是任意多次的重复匹配或规定次数的重复匹配。
re.split('[ ,]*', "1 2, 3 4, , 5") # 任意多个空格和逗号切分
re.split("a*", "abbaaabbdbbabbababbabb") # 结果 ['', 'bb', 'bbdbb', 'bb', 'b', 'bb', 'bb']
# Python3测试发现通配符*无法得到预期结果,使用+号可以
re.split('[ ,]+', "1 2, 3 4, , 5") # 任意多个空格和逗号切分
re.split("a+", "abbaaabbdbbabbababbabb") # 结果 ['', 'bb', 'bbdbb', 'bb', 'b', 'bb', 'bb']
a|b|c: 匹配a或者b或者c
0|[1-9]\d*: 匹配Python的十进制证书(Python负号看作运算符,非0整数不能以0开头)
0\d{2}-\d{8}|0\d{3}-\d{7,8}:匹配国内固定电话号码的模式,考虑区号有两位或三位,三位区号时局地号码为7位或8位
match1 = re.search(pattern, string)
if match1:
... match1 ... text ... # 使用match对象的处理操作
match对象提供了一组方法,用于检查和使用与匹配有关的信息。
在一次成功匹配中,模式串里的各个组也都成功匹配,与它们匹配的那一组字符串将从1开始编号,而后可以通过方法调用match.group(n)获取。作为特殊情况,组0就是与整个模式匹配的字符串。match.groups()将得到一个序对,其中包含从编号1开始的各个组匹配的串。
组还有一个重要用途,就是在匹配中应用前面的成功匹配,建立前后的部分匹配之间的约束关系。
match = re.search('.((.)e)f', 'abcdef')
print(match .group()) # cdef
print(match .groups()) # ('de', 'd')