Python正则表达式

来源:互联网 发布:淘宝碧素堂面膜怎么样 编辑:程序博客网 时间:2024/06/04 22:26

主要内容:
1.正则表达式基本概念
2.python正则表达式re模块
3.正则表达式语法
4.re模块相关方法使用


正则表达式概念:

1.使用单个字符串来描述匹配一系列符合某个句法规则的字符串
2.是对字符串操作的一种逻辑公式
3.处理文本和数据
4.正则表达式过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;否则匹配失败。


python第一个正则表达式:

1.import re:正则表达式模块
2.第一个正则表达式:

r‘imooc’→Pattern→Match→resultimport re #导入re模块生成pattern对象:pa = re.compile(r'imooc')     #匹配的字符生成match对象:ma = pa.match('imooc.com')      #被匹配的字符ma.group()      ==>imooc                      #返回匹配的字符    ma.span()      ==>(0,5)               #被匹配字符串所在索引位置ma.string()     ==>'imooc.com'             #返回被匹配字符串ma.re           ==>re.compile(r'imooc')        #返回实例

正常匹配需要使用compile、match方法,先生成一个pattern对象,再生成一个match对象。pattern对象相当于将匹配字符串进行了包装,便于之后的match(匹配)。生成的的match对象是将原字符串与匹配字符串进行比较,将匹配成功的结果存入match对象中。使用group()方法可以将匹配成功的结果打印出来。


正则表达式语法:

.→ 匹配所有字符(除了换行符\n)
[…]→ 匹配字符集[a-zA-Z0-9]
\d/\D→ 匹配数字/匹配非数字
\s/\S →匹配空白字符/匹配非空白字符
\w/\W →匹配单词字符[a-zA-Z0-9](,.等都不能匹配)/匹配非单词字符(,.等都能匹配)
* →匹配前一个字符0次或者无限次
+ →匹配前一个字符1次或者无限次
? →匹配前一个字符0次或者1次
{m}/{n-m} →匹配前一个字符m次或者m-n次
*?/+?/?? →匹配模式变为非贪婪(尽可能少匹配字符)
^→ 匹配字符串的开头
$ →匹配字符串的结尾
| →匹配左右任意一个表达式,或
\A/ \Z→指定的字符串必须出现在开头/结尾
(ab)→ 括号中表达式作为一个分组
\→ 引用编号为number的分组匹配到的字符串
(?P) →分组起别名
(?P=name) →引用别名为name的分组匹配字符串

re=re.match(r'[_a-zA-Z]+[_\w]*','_htll')ma.group  #返回_htll,有效re=re.match(r'[_a-zA-Z]+[_\w]*','[htll')ma.group  #无效ma=re.match(r'[1-9]?[0-9]','99')ma.group    #有效ma=re.match(r'[1-9]?[0-9]','9')ma.group    #有效ma=re.match(r'[1-9]?[0-9]','09')ma.group    #只匹配了0ma=re.match(r'[a-zA-Z0-9]{6}','abc123')ma.group    #有效ma=re.match(r'[a-zA-Z0-9]{6}','abc1234')ma.group    #只匹配到abc123ma=re.match(r'[a-zA-Z0-9]{6}','abc12_')ma.group    #无效ma=re.match(r'[a-zA-Z0-9]{6,10}@163.com','abc123@163.com')ma.group    #有效ma=re.match(r'[a-zA-Z0-9]{6,10}@163.com','abcedu12345@163.com')ma.group    #无效,长度超出ma=re.match(r'[0-9][a-z]*','1bc')ma.group    #贪婪模式,匹配到1bcma=re.match(r'[0-9][a-z]*?','1bc')ma.group    #非贪婪模式,尽可能少匹配,匹配到1。ma=re.match(r'[\w]{4,10}@163.com','abc123@163.comabc')ma.group    #匹配到abc123@163.comma=re.match(r'[a-zA-Z0-9]{6,10}@163.com$','abc123@163.comabc')ma.group    #无效,必须以@163.com结尾ma=re.match(r'<[\w]+>','<book>')ma.group    #有效ma=re.match(r'<([\w]+>)','<book>')ma.group    #有效ma=re.match(r'<([\w]+>)\1','<book>book>')ma.group    #有效

() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。
(\s*)表示连续空格的字符串。
[]是定义匹配的字符范围。比如[a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。
[\s*]表示空格或者*号。
{}一般用来表示匹配的长度,比如 \s{3}表示匹配三个空格,\s[1,3]表示匹配一到三个空格。 (0-9) 匹配 ‘0-9′ 本身。 [0-9]* 匹配数字(注意后面有*,可以为空)[0-9]+ 匹配数字(注意后面有 +,不可以为空){1-9} 写法错误。 [0-9]{0,9} 表示长度为 0 到 9 的数字字符串。


re模块其他方法

search(pattern, string, flags=0) #在一个字符串中查找匹配
findall(pattern, string, flags=0) #返回所有匹配的列表集合
sub(pattern, repl, string, count=0, flags=0) #匹配部分替换为其他值
split(pattern, string, maxsplit=0, flags=0) #根据匹配分割字符串,返回分割字符串组成的列表


练习

抓取网页中的图片到本地:
1,抓取网页
2,获取图片地址
3.抓取图片内容并保存到本地

import urllib3import rehttp = urllib3.PoolManager()# 1: site urlreq = http.request('GET', 'http://www.imooc.com/course/list')content = req.data.decode('utf-8')# 2: picture urlslisturl = re.findall(r'src=.+\.jpg', content)pic_url_list = map(lambda x : x[:4], listurl)# 3: write picturesi = 0for url in pic_url_list:    # open as a binary file    f = open(str(i)+ '.jpg', 'wb')    f.write(http.request('GET', url).data)    f.close()    i += 1
原创粉丝点击