什么是正则表达式
1、使用单个字符串来描述匹配一系列符合某个句法规则的字符串
2、是对字符串操作的一种逻辑公式
3、应用场景:处理文本和数据
4、正则表达式过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功,否则匹配失败
练习:查找以字符串“aa”开头的字符串 //以字符串“aa”开头和结尾的字符串//查找以数字和字母开头的字符串(变量)
Python 正则表达式
- import re :python 正则表达式模块
- 第一个正则表达式
re.compile(r'imo') pattern.match('imooc python')
r'imooc'-->Pattern-->Match-->result
strl='imooc python'
strl.find('11') #-1
strl.find('imooc') #0
strl.startswith('imooc')
import re
pa= re.compile(r'imooc') #生成一个Pattern实例
help(pa.match)
ma=pa.match(strl) #返回一个Match对象
ma.group() #返回一个字符串或者元组
ma.span()
ma.string
pa1=re.compile(r'_')
ma1=pa1.match('_value')
ma1.group()
ma1.groups() #返回元组
pa= re.compile(r'imooc',re.I) #忽略imooc的大小写
#也可以使用ma=re.match(r'imo',str1)这种方式
Python 正则表达式语法
- . 匹配任意字符(除了\n)
ma=re.match(r'{.}','{a}')
- […] 匹配字符集 中的任意一个字符
匹配{[a-z]}
ma=re.match(r'{[abc]}','{a}')
ma=re.match(r'{[a-z]}','{a}') #匹配a到z中的任意一个字符
- \d或\D 匹配数字/非数字
- \s或\S 匹配空白/非空白字符
- \w或\W 匹配单词字符[a-zA-Z0-9]/非单词字符
ma=re.match(r'[[abc]]','[a]') #ma.group()匹配不到
ma=re.match(r'\[[abc]\]','[a]') #加上转义字符即可
- * 匹配前一个字符0次或者无限次
ma=re.match(r'[A-Z][a-z]*','Aqerwf')
- + 匹配前一个字符1次或者无限次
ma=re.match(r'[_a-zA-Z]+[_\w]*','_htl')
- ? 匹配前一个字符0次或者1次
匹配0到99的数字: [1-9]?[0-9] - {m}/{m,n} 匹配前一个字符m次或者m到n次
匹配邮箱地址
ma=re.match(r'[a-zA-Z0-9]{6}','abc1234') #匹配到abc123
ma=re.match(r'[a-zA-Z0-9]{6}@163.com','abc1234@163.com')
ma=re.match(r'[a-zA-Z0-9]{6,10}@163.com','abc123456789@163.com')
- *? /+? /?? 匹配模式变为非贪婪(尽可能少匹配字符)
ma=re.match(r'[0-9][a-z]*?','1bc') #ma.group()返回'1'
ma=re.match(r'[0-9][a-z]*','1bc') #ma.group()返回'1bc'
Python 正则表达式语法:边界匹配
- ^ 匹配字符串开头
- $ 匹配字符串结尾
ma=re.match(r'^[\w]{4,10}@163.com$','abc1234@163.com')
- \A / \Z 指定的字符串必须出现在开头/结尾
ma=re.match(r'\Aimooc[\w]*','imoocpython') #必须以imooc开头
Python 正则表达式语法:分组匹配
- | 匹配左右任意一个表达式
ma= re.match(r'abc|d','abc')
ma= re.match(r'abc|d','d')
ma= re.match(r'[1-9]?\d$|100','100') # 能匹配0-100
- (ab) 将括号中表达式作为一个分组
匹配163邮箱和126邮箱
ma=re.match(r'^[\w]{4,10}@163.com','abc1234@163.com')
ma=re.match(r'^[\w]{4,10}@(163|126).com','abc1234@126.com')
- <number> 引用编号为num的分组匹配到的字符串
常用在判断xml语法的有效性python:
ma=re.match(r'<[\w]+>','<book>') #得到<book>
ma=re.match(r'<([\w]+>)','<book>') #得到<book>
ma=re.match(r'<([\w]+>)\1','<book>') #得到 book>
ma=re.match(r'<([\w]+>)\1','<book>book>') #得到 book>book>
ma=re.match(r'<([\w]+>)[\w]+</\1','<book>python</book>')
#得到 <book>python</book>
- (?P<name>) 对分组起一个别名
ma=re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>')
#得到 <book>python</book>
- (?P=name) 引用别名为name的分组匹配字符串
Python 正则表达式–re模块其它方法
- search(pattern,string,flags=0)
在一个字符串中查找匹配
str1='imooc videonum =1000' #查找数字
info=re.search(r'\d+',str1)
info.group()
- findall(pattern,string,flags=0)
找到匹配,返回所有匹配部分的列表
str2='imooc c++=100 java=50,python=70' #查找数字
info2=re.findall(r'\d+',str2)
print info2
- sub(pattern,repl,string,count=0,flags=0)
将字符串中匹配正则表达式的部分替换为其它值
(repl可表示字符串或者表达式,count表示次数)
str3='imooc videonum =1000' #
info3=re.sub(r'\d+','1001',str3)
def add1(match):
val=match.group()
num=int(val)+1
return str(val)
info3=re.sub(r'\d+',add1,str3)#repl为函数
- split(pattern,string,maxsplit=0,flags=0)
根据匹配分割字符串,返回分割字符串组成的列表
str4='imooc:C C++ java ,Python'
re.split(r':| |,',str4)
Python 正则表达式–练习
抓取网页中的图片到本地,步骤:
- 1 抓取网页
- 2 获取图片地址
- 3 抓取图片内容并保存到本地
import urllib2
req=urllib2.urlopen('地址')
buf = req.read()
import re
listurl=re.findall(r'http:.+\.jpg',buf)
i=0
for url in listurl:
f = open(str(i)+'.jpg','w')
req=urllib2.urlopen(url)
buf = req.read
f.write(buf)
i+=1