正则表达式(regular expression):也叫作匹配模式,是使用一些特殊符号来查找或匹配或替换字符串文本的一种技术
1.python对正则表达式的使用:re模块
>> > import re
>> > dir ( re)
[ 'A' , 'ASCII' , 'DEBUG' , 'DOTALL' , 'I' , 'IGNORECASE' , 'L' , 'LOCALE' , 'M' , 'MULTILINE' , 'RegexFlag' , 'S' , 'Scanner' , 'T' , 'TEMPLATE' , 'U' , 'UNICODE' , 'VERBOSE' , 'X' , '_MAXCACHE' , '__all__' , '__builtins__' , '__cached__' , '__doc__' , '__file__' , '__loader__' , '__name__' , '__package__' , '__spec__' , '__version__' , '_alphanum_bytes' , '_alphanum_str' , '_cache' , '_compile' , '_compile_repl' , '_expand' , '_locale' , '_pattern_type' , '_pickle' , '_subx' , 'compile' , 'copyreg' , 'enum' , 'error' , 'escape' , 'findall' , 'finditer' , 'fullmatch' , 'functools' , 'match' , 'purge' , 'search' , 'split' , 'sre_compile' , 'sre_parse' , 'sub' , 'subn' , 'template' ]
2.正则表达式的规范
字 符 描述 元字符: \d . \w \s ^ $ [] \d 匹配数字(digest) . 匹配任意符号中文也可以,除了\n \w 匹配所有有效符号(大小写字母,数字,下划线,各国的语言符号) \s 匹配空白位(空格,\t) ^ 以什么开头 $ 以什么结尾 [] 表示列举,括号里的某一个([0123456789],[a-z],[A-Z],[A-Za-z0-9_],[\u4e00-\u9fa5]-汉字) 反义符: \D \W \S [^] \D 匹配非数字 \W 匹配非有效符号,也就是特殊符号 \S 非空白位 [^] 列举反义 注意^[] 和 [^] >>> re.findall(“1[^356789]\d{9}”,“13991039425”) 结果:[] 转义符 在Python中\具有转义的含义,如要正常表示一个\,则需要两个\\。建议大家以后在写正则的时候,一定要在正则表达式前面加上r。
>> > re. match ( "C:\\\\a\\\\b\\\\c" , "C:\\a\\b\\c" ) #\\两次转义,一次字符串,一次正则表达式
< _sre. SRE_Match object; span= ( 0 , 8 ) , match= 'C:\\a\\b\\c' >
>> > re. match ( r"C:\\a\\b\\c" , "C:\\a\\b\\c" )
< _sre. SRE_Match object; span= ( 0 , 8 ) , match= 'C:\\a\\b\\c' >
结论:建议大家以后在写正则的时候,一定要在正则表达式前面加上r
位数 * + ? {n} {n,} {n,m} * (位数)任意多个(0个1个多个) + (位数)任意多个(至少有一位) ? 0位或一位 {n} 有n位 eg:{3} 表示有3位 {n,} 至少n位 {n,m} n-m区间范围 分组(group) 在正则表达式中,使用圆括号()将正则包裹起来,会形成正则匹配后的二次筛选。分组最好的好处就是能够形成二次筛选 贪婪模式与懒惰模式 贪婪模式和非贪婪(懒惰)模式:在python中,默认是贪婪模式在.*+?{n}{n,}后面加上?,可以将贪婪模式转换成费贪婪模式
>> > s= "<div><ul><li><a href=" ">哈哈1</a></li><li><a href=" ">哈哈2</a></li></ul></div>"
>> > re. sub ( r"</?.*?>" , "" , s)
'哈哈1哈哈2'
>> > re. findall ( r"<\w+>(.*)</\w+>" , s)
[ < ul> < li> < a href= "" > 哈哈1 < / a> < / li> < li> < a href= "" > 哈哈2 < / a> < / li> < / ul> ] #贪婪模式
>> > re. findall ( r"<\w+>(.*?)</\w+>" , s)
[ 哈哈1 , 哈哈2 ] #将贪婪模式转换成非贪婪
>> > re. match ( r"<(\w+)>.*</\1>" , "<a>这是一个连接标签</a>" )
< _sre. SRE_Match object; span= ( 0 , 15 ) , match= '<a>这是一个连接标签</a>' >
3.常用正则表达式
用户名 ^[a-z0-9_-]{3,16}$ 密码 ^[a-z0-9_-]{6,18}$ 十六进制值 ^#?([a-f0-9]{6}|[a-f0-9]{3})$ 电子邮箱 ^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})$ 或 ^[a-z\d]+(.[a-z\d]+)*@(\da-z ?)+(.{1,2}[a-z]+)+$ URL ^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w\ .-]*)*\/?$ IP 地址 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) HTML 标签 ^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$ 删除代码\注释 (?<!http:|\S)//.*$ Unicode编码中的汉字范围 ^[\u4e00-\u9fa5]+$
4.re模块中的方法
方法:
match("要匹配的","待匹配的") #表示从头匹配,返回的是一个对象,提取用group()函数
findall() #返回的是一个列表、
sub()
search()
split() #分割字符串
>>> re.split(r"\.","www.baidu.com")
['www', 'baidu', 'com']