第八课 - 正则表达式

# 概述 正则表达式是一个特殊的字符序列,它常常用于检查是否与某种模式匹配。第八节课主要从以下几方面介绍了Python正则表达式的用法。 (1)re模块的使用 (2)字符匹配、数量表示、边界表示 (3)正则表达式的高级用法 (4)贪婪与非贪婪模式 # re模块 (一)match(正则表达式,待匹配字符串) (1)采用从左向右逐项匹配,从起始位置起。 (2)用于正则匹配检查,如果“待匹配字符串”能够匹配“正则表达式”,则match方法返回匹配对象,否则返回None ``` import re #导入re模块 #从起始位置开始匹配 rs = re.match("chinahadoop", "chinahadoop.cn") print(rs.group()) #不从起始位置开始匹配 rs = re.match("cn", "chinahadoop.cn") ``` 运行结果: ``` chinahadoop None ``` (二)group()方法 :用来返回字符串的匹配部分 # 字符匹配、数量表示、边界表示 **(一)单字符匹配** ![](http://wenda.chinahadoop.cn/uploads/questions/20180427/d6e50502f8547f691c4db264e512b86f.png) (1). 匹配除"\n"之外的任意单个字符 ``` import re rs = re.match(".", "a") print(rs.group()) rs = re.match("...", "abc") #多个字符 print(rs.group()) rs = re.match(".", "\n") print(rs) ``` 运行结果: ``` a abc None ``` (2)\s:匹配任意空白字符,如空格,制表符“\t”,换行符“\n” ``` import re rs = re.match("\s", "\t") print(rs) rs = re.match("\s", "\n") print(rs) rs = re.match("\s", " ") print(rs) ``` (3)\S:匹配任意非空字符;和\s模式相反 ``` rs = re.match("\S", "\t") print(rs) rs = re.match("\S", "abc") #匹配单个字符,从起始位置 print(rs.group()) ``` 运行结果: ``` None a ``` (4)[]: 匹配[ ]中列举的字符 ``` rs = re.match("[Hh]", "hello") print(rs.group()) rs = re.match("[Hh]", "Hello") print(rs.group()) rs = re.match("[0123456789]", "32") print(rs.group()) rs = re.match("[0-9]", "3") print(rs.group()) ``` 运行返回结果: ``` h H 3 3 ``` 其他单字符匹配用法不一一列举。 **(二)数量表示** ![](http://wenda.chinahadoop.cn/uploads/questions/20180427/46a3adb3096c9ce3c51abf90d6d9c103.png) (1)* 出现次数 n >= 0 ``` import re rs = re.match("1\d*", "1234567") #起始是1,后面数字[0-9]出现任意次 print(rs.group()) rs = re.match("1\d*", "1234567abc") #起始是1,后面数字[0-9]出现任意次 print(rs.group()) ``` 运行结果: ``` 1234567 1234567 ``` (2)+ 出现次数n >=1 ``` rs = re.match("\d+", "abc") print(rs) rs = re.match("\d+", "1abc") print(rs.group()) ``` 运行结果: ``` None 1 ``` (3){m}, {m,} 和 {m, n} ``` #{m} : 一个字符出现m次 rs = re.match("\d{3}", "123abc") print(rs.group()) #{m,} :一个字符至少出现m次 rs = re.match("\d{1,}", "123467abc") #等价于+至少一次 print(rs.group()) #{m,n} :一个字符出现m到n次 rs = re.match("\d{0,1}", "1abc") #等价于?至多一次 print(rs.group()) ``` 运行结果: ``` 123 123467 1 ``` (4)\转义字符 ``` str1 = "hello\\world" print(str1) str2 = "hello\\\\world" print(str2) str3 = r"hello\\world" #原生字符:r"str" print(str3) rs = re.match("\w{5}\\\\\\\\\w{5}",str3) print(rs.group()) rs = re.match(r"\w{5}\\\\\w{5}",str3) print(rs.group()) ``` 运行结果: ``` hello\world hello\\world hello\\world hello\\world hello\\world ``` **(三)边界表示** (1)字符串与单词边界:$结尾 ``` rs = re.match("\w{3,10}@163.com","hello_124@163mcom") print(rs.group()) rs = re.match("\w{3,10}@163\.com$","hello_124@163.com") print(rs.group()) ``` 运行结果: ``` hello_124@163mcom hello_124@163.com ``` 注意:第一个邮箱匹配实际是我们不期望的。但是它仍然被匹配成功,是因为字符**. **被当成单字符匹配了。所以我们需要加上转义字符,让**. **被当成正常字符。 (2)匹配分组:()分组,索引可由自己制定,比如?P ``` html_str = "python" rs = re.match(r"<.+><.+>.+",html_str) print(rs.group()) html_str2 = "python</head>" rs = re.match(r"<.+><.+>.+",html_str2) #wrong to match print(rs.group()) rs = re.match(r"<(.+)><(.+)>.+",html_str) #\2 and \1 is an index print(rs.group()) rs = re.match(r"<(?P.+)><(?P.+)>.+",html_str) print(rs.group()) ``` 运行结果: ``` python python</head> python python ``` # 正则表达式的高级用法: **search(), findall(), finditer(), and sub()方法** ``` #search rs = re.search("car","haha car carbal abcar carbal") print(rs.group()) #findall : return a list rs = re.findall("car","haha car carbal abcar carbal") print(rs) mail_str = "zhangsan:helloworld@163.com,li:123456@qq.cn" list = re.findall(r"(\w{3,20}@(163|qq)\.(com|cn))",mail_str) print(list) #finditer itor = re.finditer(r"\w{3,20}@(163|qq)\.(com|cn)",mail_str) for it in itor: print(it.group()) #sub :java 被python替换。sub()方法的第二个参数还可以是一个函数。 str = "java python c cpp java" rs = re.sub(r"java","python",str) print(rs) ``` 运行结果: ``` car ['car', 'car', 'car', 'car'] [('helloworld@163.com', '163', 'com'), ('123456@qq.cn', 'qq', 'cn')] helloworld@163.com 123456@qq.cn python python c cpp python ``` # 贪婪与非贪婪模式 (1)贪婪模式:尽可能的匹配更多的字符 (2)非贪婪模式:与贪婪模式相反 ``` rs = re.findall(r"hello\d*","hello12345") print(rs) rs = re.findall(r"hello\d*?","hello12345") print(rs) ``` 运行结果: ``` ['hello12345'] ['hello'] ``` 作业链接: http://wenda.chinahadoop.cn/article/702

0 个评论

要回复文章请先登录注册