上一章Python教程请查看:python面向对象编程:类和对象详解
正则表达式是一组特殊的字符序列,它使用模式中包含的特殊语法帮助你匹配或查找其他字符串或字符串集,正则表达式在UNIX世界中被广泛使用。
Python模块re提供了对Python中类似perl的正则表达式的完全支持,如果在编译或使用正则表达式时发生错误,re模块将引发异常re.error。
我们将介绍两个重要的函数,它们将用于处理正则表达式。但首先有一件小事:有各种各样的字符,在正则表达式中使用它们时会有特殊的意义。为了避免在处理正则表达式时产生任何混淆,我们将使用原始字符串作为r’expression’。
一、匹配函数
此函数尝试使用可选标志将RE模式与字符串匹配。
下面是这个函数的语法
re.match(pattern, string, flags=0)
下面是参数的描述
编号 | 参数和说明 |
1 | pattern 这是要匹配的正则表达式。 |
2 | string 这是字符串,它将被搜索以匹配字符串开头的模式。 |
3 | flags 可以使用bitwise或(|)指定不同的标志。这些是修饰词,在下表中列出。 |
match函数成功时返回match对象,失败时返回None对象,我们使用match对象的group(num)或groups()函数来获得匹配的表达式。
编号 | 匹配对象方法 & 描述 |
1 | group(num=0) 此方法返回整个匹配(或特定的子组num) |
2 | groups() 这个方法返回一个tuple中的所有匹配子组(如果没有匹配子组,则为空) |
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"
二、搜索功能
此函数使用可选标志在字符串中搜索第一次出现的RE模式。
下面是这个函数的语法
re.search(pattern, string, flags=0)
下面是参数的描述
编号 | 参数和说明 |
1 | pattern 这是要匹配的正则表达式。 |
2 | string 这是字符串,将搜索它以匹配字符串中的任何地方的模式。 |
3 | flags 可以使用bitwise或(|)指定不同的标志。这些是修饰词,在下表中列出。 |
search函数在成功时返回一个匹配对象,在失败时返回一个匹配对象。我们使用匹配对象的group(num)或groups()函数来获得匹配的表达式。
编号 | 对象方法 & 说明 |
1 | group(num=0) 此方法返回整个匹配(或特定的子组num) |
2 | groups() 这个方法返回一个tuple中的所有匹配子组(如果没有匹配子组,则为空) |
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print "searchObj.group() : ", searchObj.group()
print "searchObj.group(1) : ", searchObj.group(1)
print "searchObj.group(2) : ", searchObj.group(2)
else:
print "Nothing found!!"
三、匹配与搜索
Python基于正则表达式提供了两种不同的基本操作:匹配只检查字符串开头的匹配,而搜索检查字符串中任何地方的匹配(这是Perl的默认操作)。
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print "search --> searchObj.group() : ", searchObj.group()
else:
print "Nothing found!!"
四、搜索和替换
使用正则表达式的最重要的re方法之一是sub。
re.sub(pattern, repl, string, max=0)
这个方法用repl替换字符串中所有出现的RE模式,替换所有出现的RE模式,除非提供max,此方法返回修改后的字符串。
#!/usr/bin/python
import re
phone = "5489-369-369 # Phone Number"
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num
num = re.sub(r'\D', "", phone)
print "Phone Num : ", num
五、正则表达式修饰符:选项标志
正则表达式文本可以包含一个可选的修饰符来控制匹配的各个方面,修饰符被指定为一个可选的标志,你可以使用exclusive或(|)提供多个修饰词,如前所示,可以用其中一个表示:
编号 | 修饰符 & 说明 |
1 | re.I 执行不区分大小写的匹配。 |
2 | re.L 根据当前语言环境解释单词。这种解释影响字母组(\w和\w),以及单词边界行为(\b和\b)。 |
3 | re.M 使$匹配一行的结束(不仅仅是字符串的结束),使^匹配任何一行的开始(不仅仅是字符串的开始)。 |
4 | re.S 使句点(dot)匹配任何字符,包括换行符。 |
5 | re.U 根据Unicode字符集解释字母,此标志影响\w、\w、\b、\b的行为。 |
6 | re.X 允许“cuter”正则表达式语法,它会忽略空白(除了set[]内部或通过反斜杠转义时),并将未转义的#作为注释标记。 |
六、正则表达式模式
除了控制字符外,(+ ?.* ^ $()[]{} | \),所有字符匹配自身,你可以通过在控制字符前面加上反斜杠来转义它。
下表列出了Python中可用的正则表达式语法
编号 | 模式和描述 |
1 | ^ 匹配行首 |
2 | $ 匹配行结束。 |
3 | . 匹配除换行以外的任何单个字符,使用m选项也允许它匹配换行。 |
4 | […] 匹配方括号中的任何单个字符。 |
5 | [^…] 匹配不在方括号中的任何单个字符 |
6 | re* 匹配0个或多个前一个表达式。 |
7 | re+ 匹配前一个表达式的一个或多个匹配项。 |
8 | re? 匹配前一个表达式的0或1次出现。 |
9 | re{ n} 精确匹配前一个表达式出现的n次。 |
10 | re{ n,} 匹配n个或多个前一个表达式。 |
11 | re{ n, m} 至少匹配n个且最多匹配m个前一个表达式。 |
12 | a| b 匹配a或b。 |
13 | (re) 将正则表达式分组并记住匹配的文本。 |
14 | (?imx) 在正则表达式中临时切换i、m或x选项。如果在括号中,则只影响该区域。 |
15 | (?-imx) 临时切换正则表达式中的i、m或x选项。如果在括号中,则只影响该区域。 |
16 | (?: re) 将正则表达式分组,而不需要记住匹配的文本。 |
17 | (?imx: re) 在括号内临时切换i、m或x选项。 |
18 | (?-imx: re) 暂时关闭括号内的i、m或x选项。 |
19 | (?#…) 注释。 |
20 | (?= re) 使用模式指定位置,没有范围。 |
21 | (?! re) 使用模式否定指定位置。没有范围。 |
22 | (?> re) 匹配不回溯的独立模式。 |
23 | \w 匹配单词字符。 |
24 | \W 非言词字符匹配。 |
25 | \s 匹配空格,相当于[\t\n\r\f]。 |
26 | \S 匹配非空白 |
27 | \d 匹配的数字,相当于[0 – 9]。 |
28 | \D 数字匹配。 |
29 | \A 匹配字符串的开头。 |
30 | \Z 匹配字符串结束。如果存在换行,它将在换行之前匹配。 |
31 | \z 匹配字符串结束。 |
32 | \G 匹配点为最后一次匹配完成的地方 |
33 | \b 在括号外匹配单词边界,在方括号内匹配backspace (0x08)。 |
34 | \B 匹配非词边界。 |
35 | \n, \t, etc. 匹配换行、回车、制表符等。 |
36 | \1…\9 匹配第n个分组子表达式。 |
37 | \10 如果已经匹配,则匹配第n个分组子表达式。否则指字符代码的八进制表示。 |
七、正则表达式示例
字面量字符
编号 | 例子和说明 |
1 | python 匹配 “python”. |
八、字符类
编号 | 例子和说明 |
1 | [Pp]ython 匹配”Python” 或 “python” |
2 | rub[ye] 匹配”ruby” 或 “rube” |
3 | [aeiou] 匹配任意一个小写元音 |
4 | [0-9] 匹配任意数字,和 [0123456789]一样 |
5 | [a-z] 匹配任何小写的ASCII字母 |
6 | [A-Z] 匹配任何大写ASCII字母 |
7 | [a-zA-Z0-9] 匹配以上任何一个 |
8 | [^aeiou] 匹配除小写元音以外的任何字母 |
9 | [^0-9] 匹配除数字以外的任何内容 |
九、特殊字符类
编号 | 例子和说明 |
1 | . 匹配除换行以外的任何字符 |
2 | \d 匹配一个数字: [0-9] |
3 | \D 匹配非数字: [^0-9] |
4 | \s 匹配空白字符: [ \t\r\n\f] |
5 | \S 匹配非空白字符: [^ \t\r\n\f] |
6 | \w 匹配单个单词字符: [A-Za-z0-9_] |
7 | \W 匹配非单词字符: [^A-Za-z0-9_] |
十、重复匹配的例子
编号 | 例子和说明 |
1 | ruby? 匹配“rub”或“ruby”:y可选 |
2 | ruby* 匹配“rub”加上0或更多y |
3 | ruby+ 匹配“rub”加上一个或多个y |
4 | \d{3} 匹配3位数字 |
5 | \d{3,} 匹配3位或更多的数字 |
6 | \d{3,5} 匹配3、4或5位数字 |
十一、非贪婪重复
这匹配最小的重复次数
编号 | 例子和说明 |
1 | <.*> 贪婪重复: 匹配 “<python>perl>” |
2 | <.*?> 非贪婪: 匹配 “<python>” ,在 “<python>perl>”中 |
十二、分组与括号
编号 | 例子和说明 |
1 | \D\d+ 无组: + 重复 \d |
2 | (\D\d)+ 有组: + 重复 \D\d |
3 | ([Pp]ython(, )?)+ 匹配 “Python”, “Python, python, python” |
十三、反向引用
这与之前匹配的组再次匹配
编号 | 例子和说明 |
1 | ([Pp])ython&\1ails 匹配 python&pails 或 Python&Pails |
2 | ([‘”])[^\1]*\1 单引号或双引号字符串,\1匹配第1组匹配的内容,\2匹配第二组匹配的内容等等。 |
十四、替代方案
编号 | 例子和说明 |
1 | python|perl 匹配 “python” 或 “perl” |
2 | rub(y|le)) 匹配 “ruby” 或 “ruble” |
3 | Python(!+|\?) “Python”后面跟一个或多个!或一个? |
十五、锚点和匹配位置
这需要指定匹配位置。
编号 | 例子和说明 |
1 | ^Python 在字符串或内部行的开头匹配“Python” |
2 | Python$ 在字符串或行的末尾匹配“Python” |
3 | \APython 匹配字符串开头的“Python” |
4 | Python\Z 匹配字符串末尾的“Python” |
5 | \bPython\b 在单词边界匹配“Python” |
6 | \brub\B \B是无词边界:将“rub”与“rube”和“ruby”匹配,但不是单独匹配 |
7 | Python(?=!) 如果后跟感叹号,则匹配“Python”。 |
8 | Python(?!!) 如果后面没有感叹号,则匹配“Python”。 |
十六、带括号的特殊语法
编号 | 例子和说明 |
1 | R(?#comment) 匹配“R”,其余的都是注释 |
2 | R(?i)uby 匹配“uby”时不区分大小写 |
3 | R(?i:uby) 同上 |
4 | rub(?:y|le)) 只是组而不创建\1反向引用 |
评论前必须登录!
注册