一、正则表达式基本概念
首先想为什么要使用正则表达式,在处理文本的时候,难道只使用字符串匹配就足够了吗,比如在一个文本中找到以hello开头的语句:
def find_start(f_name):
f=open(f_name)
for line in f:
if line.startswith("hello"):
print line
find_start("hello.txt")
当我们要找到以hello开头和结尾的语句我们又要写一个函数,每次遇到不同的需求就要写不同的函数,而正则表达式就是用来抽象出一个规则的。
正则表达式的概念:
1、使用单个字符串来描述匹配一系列符合某个句法规则的字符串
2、对字符串操作的一种逻辑公式
3、应用场景:处理文本和数据
4、正则表达式过程:依次拿出表达式和文本字符中的比较,如果每一个字符都能匹配,则匹配成功,否则匹配失败。
二、python正则表达式re模块
在python中使用正则表达式来匹配字符串,需要导入re模块
1、import re :python正则表达式模块
2、使用re过程:使用re的方法compile()生成一个Pattern对象,这个对象不能够自己实例化,只能通过这个方法来生成一个对象。再调用这个Pattern对象的方法来匹配字符串,可以是match()方法或者search()、find()方法,从要匹配的字符串的开始进行匹配,返回一个Match的对象,就是结果。注意:match()是从头匹配的。
再以查找以hello开头的语句为例:
import re
pa=re.compile(r'hello')#如果想忽略大小写就pre.compile(r'hello',re.I),I代表ignore的意思
print type(pa)
help(pa.match)
str='hello python'
ma=pa.match(str)
print ma.group()
help(ma.group)
print ma.span()
print ma.string
我们来看看re的match方法:
help(re.match)
第一个参数:pattern:表示匹配的正则表达式
第二个参数:string表示要匹配的字符串
第三个参数:flags用于控制匹配的方式,比如是否区分大小写、多行匹配等。
所以上面功能也可以用如下代码:
import re
str='hello python'
ma=re.match(r'hello',str)
print ma.group()
print ma.span()
三、正则表达式语法
1、使用正则表达式匹配单个字符,也就是匹配结果是一个字符:
import re
str='hello python'
ma=re.match(r'.',str)
print ma.group()
ma=re.match(r'..',str)
print ma.group()
ma=re.match(r'[a-z]',str)
print ma.group()
ma=re.match(r'[a-zA-Z]','bA')
print ma.group()
ma=re.match(r'[\w]','ab')
print ma.group()
ma=re.match(r'\W','((ab')
print ma.group()
ma=re.match(r'\[[\w]\]','[a]')
print ma.group()
2、使用正则表达式匹配多个字符:
import re
ma=re.match(r'[A-Z][a-z]*','AafsdAfsddf')
print ma.group()
ma=re.match(r'[a-zA-Z]+[\w]','afsfsfw')
print ma.group()
ma=re.match(r'[1-9]?[0-9]','90')
print ma.group()
ma=re.match(r'[a-zA-Z0-9]{6}','abc124q')
print ma.group()
ma=re.match(r'[a-zA-Z0-9]{6,10}@126.com','abc22244@126.com')
print ma.group()
ma=re.match(r'[0-9][a-z]*?','2bff')
print ma.group()
ma=re.match(r'[0-9][a-z]+?','2bfff')
print ma.group()
ma=re.match(r'[0-9][a-z]??','2bfff')
print ma.group()
3、使用正则表达式进行边界匹配
所谓的边界就是以指定的字符为开头或结尾
import re
ma=re.match(r'^[\w]{4,10}@126.com$','222fggg@126.com')
print ma.group()
ma=re.match(r'^\Ahello[\w]*','helloladygaga')
print ma.group()
4、使用正则表达式进行分组匹配
import re
ma=re.match(r'abc|d','abc')
print ma.group()
ma=re.match(r'[\w]{4,10}@(163|126).com','22fdsf@126.com')
print ma.group()
str='<book>python</book>'
ma=re.match(r'<([\w]+>)','<book>')
print ma.group()
ma=re.match(r'<([\w]+>)\1','<book>book>')
print ma.groups()
ma=re.match(r'<([\w]+>)[\w]+</\1','<book>python</book>')
print ma.group()
ma=re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)',str)
print ma.group()
四、re相关方法使用
re中的其他方法:
1、在一个字符串中查找匹配第一次出现的位置
search(pattern,string,flags=0)
findall(pattern,string,flags=0)
sub(pattern,repl,string,count=0,flags=0)
其中repl可以是字符串,也可以是一个函数的返回值(字符串)。
count是限制标志。
4、根据匹配分割字符串,返回分割字符串组成的列表
split(pattern,string,maxsplit=0,flags=0)
pattern是分割符的正则表达式,maxsplit是分割的次数
import re
str1='total num=1000'
info=re.search(r'\d+',str1)
print info.group()
str2='first num=100,second num=90,third num=120'
info=re.findall(r'\d+',str2)
print info
str3='total num=1000'
info=re.sub(r'\d+','1001',str3)
print info
def add1(match):
val=match.group()
num=int(val)+1
return str(num)
info=re.sub(r'\d+',add1,str3)
print info
str4='hello:python java c++'
info=re.split(r':| ',str4)
print info
下面做一个练习:
下载一个网页上的所有图片。分为三步
1、抓取网页
2、获取图片地址
3、抓取图片内容并保存到本地
import urllib2
import re
req=urllib2.urlopen('http://www.imooc.com/course/list')
buf=req.read()
listurl=re.findall(r'http:.+\.jpg',buf)
print listurl
i=0
for url in listurl:
f=open(str(i)+'.jpg','w')
req=urllib2.urlopen(url)
buf=req.read()
f.write(buf)
i+=1