python高阶进程2--正则表达式

来源:互联网 发布:3d展示软件 编辑:程序博客网 时间:2024/05/17 05:05

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

1.re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

re.match(pattern, string, flags=0)
import reprint(re.match('www', 'www.baidu.com'))  #结果<_sre.SRE_Match object; span=(0, 3), match='www'>。span为位置

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

import reline = "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!!"

matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter

首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。
(.) 第一个匹配分组,. 代表匹配除换行符之外的所有字符。
(.?) 第二个匹配分组,.? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符
后面的一个 .* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。
matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符
matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的
matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的
因为只有匹配结果中只有两组,所以如果填 3 时会报错。

检索和替换
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

import rephone = "2004-959-559 # 这是一个国外电话号码"# 删除字符串中的 Python注释 num = re.sub(r'#.*$', "", phone)print "电话号码是: ", num# 删除非数字(-)的字符串 num = re.sub(r'\D', "", phone)print "电话号码是 : ", num
import re# 将匹配的数字乘于 2def double(matched):    value = int(matched.group('value'))    #value  23 4 567    return str(value * 2)s = 'A23G4HFD567'print(re.sub('(?P<value>\d+)', double, s)

正则表达式修饰符 - 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。

这里写图片描述

正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r’\t’,等价于 ‘\t’)匹配相应的特殊字符。
这里写图片描述
这里写图片描述
这里写图片描述

正则表达式实例
字符类

[Pp]ython   匹配 "Python" 或 "python"rub[ye] 匹配 "ruby" 或 "rube"[aeiou] 匹配中括号内的任意一个字母[0-9]   匹配任何数字。类似于 [0123456789][a-z]   匹配任何小写字母[A-Z]   匹配任何大写字母[a-zA-Z0-9] 匹配任何字母及数字[^aeiou]    除了aeiou字母以外的所有字符[^0-9]  匹配除了数字外的字符

特殊字符类

.   匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。\d  匹配一个数字字符。等价于 [0-9]\D  匹配一个非数字字符。等价于 [^0-9]\s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]\S  匹配任何非空白字符。等价于 [^ \f\n\r\t\v]\w  匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。\W  匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。