python正则表达式

一、正则表达式基本概念

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


2、查找匹配,返回所有匹配部分的列表

findall(pattern,string,flags=0)


3、将字符串中匹配正则表达式部分替换为其他值

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值