Python正则表达式

Python正则表达式

1.正则表达式re模块
1.re模块使用(1)

       1)import re:python 正则表达式模块

       2)第一个正则表达式


使用情况举例:

import re

 

str='imooc python'

pa=re.compile(r'imooc')#中间的参数就是匹配的内容

#此时就生成了一个pattern的实例。通过。tab可以查看所有的方法

 

ma=pa.match(str1)#ma也是一个对象,他的值放在group等相关方法,ma.span()就可以查看匹配的位置

#ma.string()保存被匹配的字符串

print ma

 

pa=re.compile(r'imooc',re.IGNORECASE)#匹配时候可以忽略大小写

 

ma.groups()#匹配的返回值的元组

ma=re.match(r'imooc',str1)#此时这种方式其实现是一样的

 

 

2.正则表达式语法
1. 正则表达式语法—单个字符(1)

字符

匹配

.

匹配任意字符(除了\n)两个就两个..

[…]

匹配字符集 [] 中的任意一个字符

\d / \D

匹配数字/非数字

\s / \S

匹配空白/ 非空白

\w/ \W

匹配单词字符【a-Za-Z0-9】/ 非单词字符

import re

 

ma=re.match(r'.','a')#匹配任意一个非\n的字符

ma=re.match(r'{.}','a{bd}')#匹配大括号中间任意字符

 

ma=re.match(r'{[abd]}','{abde}')#匹配abd中任何一个字符就可以

mma=re.match(r'{[a-z]}','{abde}')#匹配a-z中任何一个字符就可以

ma=re.match(r'{[a-zA-Z0-9]}','{abde}')#匹配a-z,A-Z,0-9中任何一个字符就可以

ma=re.match(r'[\w]','{abde}')#效果同上

 

#如果想匹配[]作为边界的字符串呢?

# ma=re.match(r'[[\w]]','{abde}')  表达是无效的

ma=re.match(r'\[[\w]\]') #添加转移就可以了

2. 正则表达式语法—多个字符(2)

符号

 匹配

*

匹配前一个字符0次或者无限次

+

匹配前一个字符1次或者无限次

?

匹配前一个字符0次或者1次

{m}/{m,n}

匹配前一个字符m次或者n次

*? / +? /??

模式匹配变为非贪婪(尽可能少匹配字符)

 

import re

 

#匹配以大写字母开头,后接小写字母0次或者无限次A-Z+a-z0-+

re.match(r'[A-Z][a-z]*','Asjdk')

 

# 匹配有效的python的变量名,以下划线或者字母开头

re.match(r'[_a-zA-Z]+[_\w]*','_name')

 

#匹配所有0-99之前的数字

re.match(r'[1-9]?[0-9]','99')#但是输入09也是匹配的

 

#匹配qq邮箱

re.match(r'[a-zA-Z0-9]{6}','ABC123')#可以匹配

re.match(r'[a-zA-Z0-9]{6}','ABC1')#匹配不成功

re.match(r'[a-zA-Z0-9]{6}','ABC11234')#匹配前6

re.match(r'[a-zA-Z0-9]{6,10}@163.com','ABC11234')#匹配163邮箱

 

re.match(r'[0-9][a-z]*','1ab')#匹配结果为 1ab

re.match(r'[0-9][a-z]*?','1ab')#匹配结果为 1

re.match(r'[0-9][a-z]+?','1ab')#匹配结果为 1a

re.match(r'[0-9][a-z]??','1ab')#匹配结果为 1

 

3. 正则表达式语法—边界匹配(3)

字符

匹配

^

匹配字符串开头

$

匹配字符串结尾

\A / \Z

指定的字符串必须出现在开头/结尾

import re

 

#re.match(r'[a-zA-Z0-9]{6,10}@163.com','imooc@163.comagd')#也是可以匹配

re.match(r'^[\w]{6,10}@163.com$','imooc@163.comagd')#这样就完全匹配了

 

#如果指定的字符串必须出现在字符串开头或者结尾呢,如指定必须以imooc开头

re.match(r'\Aimooc[\w]*','imoocpython')#可以匹配,但是 iimooc就不匹配了

 

分组匹配:

字符

匹配

|

匹配左右任意一个表达式

(ab)

括号中表达式作为一个分组

\<number>

引用编号为num的分组匹配到的字符串

(?P<name>)

分组起一个别名

(?P=name)

引用别名为name的分组匹配字符串

 

import re

 

re.match(r'abc|d','abc')

re.match(r'abc|d','d')

#匹配任意的十位数

re.match(r'[1-9]?\d$','9')#这种情况是没法匹配100

re.match(r'[1-9]?\d$|100','100')#这种情况就可以匹配了

 

 

#ab)的匹配

re.match(r'[\w]{4,6}@(163|126).com$','imooc@163.com')#匹配163或者126邮箱

 

#引用\<number>,最长用法是判断xml语法的有效性

#如匹配<book>python</book>

re.match(r'<([\w]+>)\1','<book>')#就可以显示\1所代表的值,为book>

re.match(r'<[(\w]+>)[\w]+</\1','<book>pyhon</book>')

 

#(?P<name>) (P=name)

re.match(r'<[(?P<mark>\w]+>)[\w]+</(?P=mark)','<book>pyhon</book>')

3. re模块相关方法使用
1.re模块方法介绍

1)search(pattern,string,flags=0):在一个字符串中查找匹配

2)findall(pattern,string,flags=0):找到匹配,返回所有匹配部分的列表

import re

 

str1='mooc videonum =1000'

info=re.search(r'\d+',srt1)#查找字符串中所出现的数字,只能返回第一次匹配

 

str2='c++ =100,java=90,python=80'#查找所有的数字

info=re.findall(r'\d+',str2)#此时就可以查到所有的匹配

sum(int(x)forxininfo)#对列表的解析,如求总和

3)sub(pattern,repl,string,count=0,flags=0):将字符串中匹配正则表达式的部分替换为其他值,其中repl有两种,一个是直接字符串,一种是函数返回的字符串

4)split(pattern,string,maxsplit=0,flags=0):根据匹配分割字符串,返回分割字符串组成的列表

import re

 

str3='mooc videonum =1000'

info=re.sub(r'\d+','1001',srts)#1000替换为1001

 

def add1(match):#是一个match对象

    val=match.group()

    num=int(val)+1

    returnstr(num)

info=re.sub(r'\d+',add1,srts)#自动加1

 

 

str4='imooc:c c++ java python,c#'#将所有的课程分开,

re.split(r':||,',str4)

 

2.正则表达式练习

抓取网页中的图片到本地

       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) #找到所有的url

 

i=0#用于保存文件名

 

for url inlisturl:

    f=open(str(i)+'.jpg','w')

    req=urllib2.urlopen(url)

   buf=req.read()

    f.write(buf)

    i+=1

    f.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值