正则表达式(regex、regexp或RE):
使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串正则表.通常被用来检索、替换那些符合某个模式(规则)的文本.python自1.5起提供了re模块,它提供了perl风格的正则表达式.
re模块简介
re.match函数
功能
尝试从字符串的起始位置开始匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None
原型
re.match(pattern,string,flags= 0)
re.search函数
功能
扫描整个字符串并返回第一个成功的匹配
原型
re.search(pattern,string,flags=0)
re.findall函数
功能
扫描整个字符串,并返回结果列表
原型
re.findall(pattern,string,flags=0)
函数参数
pettern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式 ,如是否匹配大小写,多行匹配等
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
正则表达式元字符
#匹配单个字符与数字
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[0123456789]
[]是字符集合,表示匹配方括号中所包含的任意字符
[awen]
匹配 'a' , 'w', 'e','n'中的任意字符
[0-9]
匹配任何数字.类似于[0123456789]
[a-z]
匹配任何小写字母
[A-Z]
匹配任何大写字母
[a-zA-Z0-9]
匹配任何字母及数字
[^abcd]
除了abcd字母以外的所有字符,[ ] 中的 ^ (脱字符)表示非,匹配不在[]中的字符
[^7-9]
匹配除了数字以外的字符
\d
匹配数字, 效果同 [0-9]
\D
匹配非数字,效果同 [^0-9]
\w
匹配数字,字母,下滑钱 ,效果同[0-9a-zA-Z_]
\W
匹配非数字,字母,下滑钱 ,效果同[^0-9a-zA-Z_]
\s
匹配任何空白字符,包括空格,换页符,换行符,回车符,制表符等等, 等价于[ \f\n\r\t]
\S
匹配非空字符,等价于 [^ \f\n\r\t]
\f 匹配一个换页符。
\n 匹配一个换行符。
\r 匹配一个回车符。
\t 匹配一个制表符。
#描字符与边界字符
^
行首匹配, 和 在 [ ]字符集合最中的^ 不是一个意思
$
行尾匹配
.
点,匹配除换行符 \n 之外的任何单字符。
\A
匹配字符串的开始,它和 "^"的区别是, "\A" 只匹配整个字符串的开头,即使在 " M"模式下, 它也不会匹配其他行的行首
\Z
匹配字符串的结束,它和 "$"的区别是, "\Z" 只匹配整个字符串的结尾,即使在 " M"模式下, 它也不会匹配其他行的行尾
\b
匹配一个单词边界,也就是指单词和空格间的位置,
例如, "er\b" 可以匹配"nerver"中的"er' , 不能匹配"verb"中的er
\B
匹配非单词边界,
例如, "er\B" 不能匹配"nerver"中的"er' , 可以匹配"verb"中的er
#匹配多个字符
说明:以下的x , y ,z均为假设的普通字符,不是正则表达式元字符
(xyz)
匹配括号中的xyz(作为一组整体去匹配)
x?
匹配0个或1个x,非贪婪方式
x*
匹配0个或者任意多个x,延伸: .*表示匹配0个或者任意多个任意字符(除换行符以外)
x+
匹配至少一个x
x{n}
匹配确定的n个x,(n是一个非负整数) 注意: 是连续的
x{n,}
匹配至少n个x,(n是一个非负整数) 注意: 是连续的
x{n,m}
匹配至少n个x, 最多m个x(n,m是一个非负整数,n <= m) 注意: 是连续的
x|y
|表示或, 这里指 x 或y
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的
非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
{} 限定符表达式。
{n} n 是一个非负整数。匹配确定的 n 次。
{n,} n 是一个非负整数。至少匹配n 次。
{n,m} m 和 n 均为非负整数,最少匹配 n 次且最多匹配 m 次。
\ 将下一个字符标记为或特殊字符\n,\\
| 指明两项之间的一个选择,'z|food' 能匹配 "z" 或 "food"
正则表达式运算优先级
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作
字符串的替换和修改
原型
sub(rule,replace,target[,count])
subn(rule,replace,target[,count])
功能
在目标字符串中按规则查找匹配的字符串,在把它们替换成指定的字符串,你可以指定一个最多替换次数,否则将替换所有匹配到的字符串
参数
rule
匹配的正则表达式
replace
指定用来替换的字符串
target
目标字符串
count
最多替换次数
sub与subn的区别
前者返回一个被替换的字符串,后者返回一个元组,第一个元素是被替换的字符串,第二个元素是一个数字,表明产生了多少次替换
分组
概述
除了简单判断是否匹配之外,正则表达式还有提取子串的强大功能, 用()表示的就是要提取的分组 (group)
示例
str6 = "111-12345678"
m = re.match(r"(?P<first>\d{3})-(?P<last>\d{8})", str6)
#使用序号获取对应组的信息,group(0)一直代表的原始字符串
print(m.group(0))
print(m.group(1))
print(m.group("first"))
print(m.group(2))
#查看匹配的各组的情况
print(m.groups())
解释
正则表达式中定义了组,就可以在Match对象上用group()方法提取子串来
group(0)永远是原始字符串,group(1),group(2)... 表示第 1, 2....个子串
编译
概述
当我们在python中使用正则表达式时,re模块内部会干2件事,
1.编译正则表达式,如果正则表达式的字符串本身不合法,会报错
2.用编译后的正则表达式去匹配字符串
优点
如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时,就不需要编译这个步骤了,直接匹配
格式
compile(rule[,flag])
示例
pat = r"^1(([3578]\d)|(47))\d{8}$"
print(re.match(pat, "13600000000"))
#编译成正则对象
re_telephon = re.compile(pat)
print(re_telephon.match("13600000000"))
方法使用的更改
#re模块调用
#re对象调用
#re.match(pattern, string, flags=0)
#re_telephon.match(string)
#re.search(pattern, string, flags=0)
#re_telephon.search(sting)
#re.findall(pattern, string, flags=0)
#re_telephon.findall(string)
#re.finditer(pattern, string, flags=0)
#re_telephon.finditer(string)
#re.split(pattern, string, maxsplit=0, flags=0)
#re_telephon.split(string, maxsplit=0)
#re.sub(pattern, repl, string, count=0, flags=0)
#re_telephon.sub(repl, string, count=0)
#re.subn(pattern, repl, string, count=0, flags=0)
#re_telephon.subn(repl, string, count=0)