正则表达式-Python实现
1、概述:Regular Expression。缩写regex,regexp,R等: 正则表达式是文本处理极为重要的工具。用它可以对字符串按照某种规则进行检索,替换。 Shell编程和高级编程语言中都支持正则表达式。 2、分类:BRE:基本正则表达式,grep、sed、vi等软件支持,vim有扩展。 ERE:扩展正则表达式,egrep(grep-E)、sed-r。 PCRE:? re模块。Python中。几乎所有高级语言都是PCRE的方言或者变种。 3、基本语法1)元字符
2)转义凡是在正则表达式中有特殊意义的符号,如果想使用它他的本意,使用转义,反斜杠自身,得使用?? r 转义后代表回车?? n? 换行 3)重复
4)基本练习:(1)匹配手机号码: d{11,} (2)匹配中国座机: d{3,4}-d{7,8} 5)源代码
断言不占分组号,断言如同条件,只是要求匹配必须满足断言条件。 分组和捕获是同一个意思; 使用正则表达式时候,能用简单表达式,就不要复杂的表达式。 6)贪婪与非贪婪;
7)引擎选项:
8)总结:单行模式; .可以匹配所有字符,包括换行符 ^表示整个字符串的开头,$整个字符串的结尾。 多行模式: .可以匹配除了换行符之外的字符。 ^表示整个字符串的开头,$整个字符串的结尾。 ^表示整个字符串的开始,$表示整个字符串的结尾。开始指的是n紧接着下一个字符,结束指的是/n前的字符。 可以认为,单行模式就如同看穿了换行符,所有文本就是一个长长的只有一行的字符串,所有^表示整个字符串的开头,$整个字符串的结尾。 多行模式,注意字符串看不见的换行符,rn 会影响e$测试,e$只能匹配en. ? *重复任意次??? 限制的话用*?? 得到了限制。 默认是贪婪模式,也就是尽量多匹配长的字符串。 9)练习题:匹配一个0-9999之间的任意数字: ^([1-9]?dd?|d)(?!d) 匹配合法的ip地址: (d{1,3}.){3}d{1,3} 192.168.1.150 0.0.0.0 255.255.255.255 17.16.52.100 172.16.0.100 400.400.999.888 001.022.003.000 257.257.255.256 ? ip的验证采用python 的socket模块. 选出含有ftp的链接。且文件的类型是gz或者xz的。 .*ftp.*/([^/]*.(?:gz|xz)) 4、python的正则表达式1)常量:r.M(re.MULTILINE)多行? r.S(re.DOTALL)单行。? r.L(re.IGNORECASE)忽略大小写。? r.X(re.VERBOSE)忽略空白字符。? 使用|或运算 2)方法、编译: re.compile(pattern,flags=0) 设定flag,编译模式。返回正则表达式对象regex。 Pattern就是正则表达式的字符串,flags是选项,正则表达式需要被编译,为了提高效率,为了提高效率,这些编译后的结果就会被保存,下次使用同样的pattern的时候,就会不需要再次编译。 re的其他方法为了提高效率都调用了编译方法,就是为了提速。 3)Re.matth(pattern,string,flags=0)匹配只是做了单次的匹配。从头开始,从第一个字符串匹配上。对匹配字符串加上了一^字符。只是匹配了一次。 Regex.match编译后可以调整位置(切片)可以设置开始和结束的位置。返回match对象?? regex = re.compile match必须是以他开头的,指定索引。 4)re.search(pattern,flags=0)??? 全文搜索,不限定在哪里开始查找,找到第一个匹配对象立即返回,找不到返回none。只是找第一个。 Regex.search()可以指定位置。 5)re.fullmatch(pattern,flags=0)完全匹配。 regex.fullmatch(string) 整个字符串和正则表达式匹配。 import re (0,‘b‘) (1,‘o‘) (2,‘t‘) (3,‘t‘) (4,‘l‘) (5,‘e‘) (6,‘n‘) (7,‘b‘) (8,‘a‘) (9,‘g‘) (10,‘n‘) (11,‘b‘) (12,‘i‘) (13,‘g‘) (14,‘n‘) (15,‘a‘) (16,‘p‘) (17,‘p‘) (18,‘l‘) (19,‘e‘) --match-- 1 <_sre.SRE_Match object; span=(0,1),match=‘b‘> 2 None 3 None 4 None 5 None 6 <_sre.SRE_Match object; span=(15,16),match=‘a‘> --search-- 7 <_sre.SRE_Match object; span=(8,9),match=‘a‘> 8 <_sre.SRE_Match object; span=(7,8),match=‘b‘> 8.5 <_sre.SRE_Match object; span=(0,match=‘b‘> 9 <_sre.SRE_Match object; span=(11,12),match=‘b‘> --fullmatch-- 10 None 11 None 12 None 13 None ? 6)、全文搜索; Re.findall(pattern,flags=0)全文搜索,全部搜索。?? 返回匹配项的列表 Regex.findall(string,) Re.finditer()?? 返回匹配项的可迭代对象。返回的都是match对象 Regex.finditer() import re (0,‘e‘) --findall-- 1 [‘b‘,‘b‘,‘b‘] 2 [‘b‘] 3 [‘b‘,‘b‘] 4 [‘b‘] 5 [‘b‘] --finder-- 1 <class ‘callable_iterator‘> 2 <_sre.SRE_Match object; span=(0,match=‘b‘> 3 <_sre.SRE_Match object; span=(7,match=‘b‘> ? ? ? 5、匹配替换:re.sub(pattern,repleacement,count=0,flags=0)?? 替换 regex.sub(replacement,count=0)? 替换 使用pattern对字符串string进行匹配,对匹配项使用replancement替换吧,可以是string,bytes,function。 re.subn(pattern,replacement,string,count=0,flags=0)输出二元组,提供替换的次数。 regex.subn(replacement,string,count=0,flags=0) regex = re.compile(‘bwg‘) 1 bottle magedu magedu apple (2,‘bottlenmagedunbignapple‘) 3 (‘bottletbagtbigtapple‘,3) ? 6、分隔字符串:Re.split(pattern,maxsplit=0,flag=0) Re.split分隔字符串 import re [‘‘,‘bottle‘,‘bag‘,‘big1‘,‘able‘] ? 7、分组:使用小括号的pattern捕获的数据放到了组group中。 Match,search函数均可以返回match对象。Findall返回的是字符串列表。。Finditer一个个返回match对象。。 如果pattern中使用了分组,如果有匹配结果,会在match对象中。 1)使用group(N)方式返回对应的分组,1-N对应的是分组,0返回整个匹配的字符串。 2)如果使用了命名分组,可以使用group(‘name’)的方式取分组。 3)也可以使用groups()返回所有组。 4)使用groupdict返回所有命名的分组。 Matcher.group() matcher.groups()返回的是二元组。 Matcher.groupdict()字典。 import re (0,‘e‘) <class ‘_sre.SRE_Match‘> 1 match (‘bottle‘,) 2 search (‘bag‘,) 3 match <_sre.SRE_Match object; span=(0,14),match=‘bottlenbagnbig‘> 4 big bag bottle 5 b‘bottlenbagnbig‘ 6 bag big 6 (‘bottle‘,‘big‘) 7 {‘name2‘: ‘bag‘,‘name3‘: ‘big‘} 8 <class ‘tuple‘> (‘bottle‘,‘big‘) 9 <class ‘_sre.SRE_Match‘> <_sre.SRE_Match object; span=(0,6),match=‘bottle‘> bottle bottle 9 <class ‘_sre.SRE_Match‘> <_sre.SRE_Match object; span=(7,10),match=‘bag‘> bag bag 9 <class ‘_sre.SRE_Match‘> <_sre.SRE_Match object; span=(11,match=‘big‘> big big 8、练习题:1)判断邮箱地址。 w+[-.w]*@[w-]+(.[w-]+)+ 2)html提取: <[^<>]+>(.*)<^<>+> 3)URL提取。 (w+)://([^s]+) 4)身份验证 身份证验证需要使用计算公式,最严格的应该是实名验证。 d{17}[0-9xX]|d{15} 5)单词统计利用makekey等进行查找。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |