首先想为什么要使用正则表达式,在处理文本的时候,难道只使用字符串匹配就足够了吗,比如在一个文本中找到以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模块
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','[email protected]') 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$','[email protected]') 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','[email protected]') 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中的其他方法:
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