python正则表达式的过程大体以下图:java
首先,经过re.compile()函数,生成pattern对象,该对象能够屡次使用。python
而后调用pattern对象的match(string)方法,在string中进行匹配,匹配成功后,返回 一个match对象,c++
经过调用match对象的group()方法,能够查看匹配到的信息。。。。正则表达式
下面,咱们简单示例一下:c#
>>> p=re.compile(r'imooc')#生成pattern对象,该对象能够屡次使用 >>> p <_sre.SRE_Pattern object at 0x7f121d1a2418> >>> type(p) <type '_sre.SRE_Pattern'> >>> m=p.match('imoocabc')#生成match对象 >>> m <_sre.SRE_Match object at 0x7f121d194238> >>> type(m) <type '_sre.SRE_Match'> >>> m.group()#匹配到的子串 'imooc' >>> m.string #被匹配的字符串 'imoocabc' >>> m.span() #匹配到的子串在原字符串中的索引位置 (0, 5) >>> m.re #pattern实例 <_sre.SRE_Pattern object at 0x7f121d1a2418> >>> >>> p=re.compile(r'imooc') >>> m=p.match('IMOOcjfjd')#匹配失败,由于区分大小写 >>> type(m) <type 'NoneType'> >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> p=re.compile(r'imooc',re.I)#re.I表示忽略(ignore)大小写 >>> p <_sre.SRE_Pattern object at 0x7f121d1b71f8> >>> type(p) <type '_sre.SRE_Pattern'> >>> m=p.match('imoocjdf') >>> m.group() 'imooc' >>> m=p.match('IMOOcjdf') >>> m.group() 'IMOOc' >>> >>> p=re.compile(r'(imooc)',re.I)#将imooc放到圆括号中 >>> p <_sre.SRE_Pattern object at 0x7f121f265f48> >>> m=p.match('iMOOCidf') >>> m <_sre.SRE_Match object at 0x7f121d1d9198> >>> m.group() 'iMOOC' >>> m.groups()#将imooc放到圆括号中,m.groups()会返回一个元组 ('iMOOC',) >>>上面的示例,咱们都是先调用re.compile()方法,生成一个pattern对象,而后再调用该pattern对象的match()方法,这两步能够合并为一步,以下:
>>> m=re.match(r'imooc','imoocjdf')#先生成pattern对象,再生成match对象,缺点:生成的pattern对象只使用了一次! >>> m <_sre.SRE_Match object at 0x7f121f2c2ac0> >>> type(m) <type '_sre.SRE_Match'> >>> m.group() 'imooc'上面是正则表达式的简单使用,如今,咱们学习正则表达式的基础语法:
【1】匹配单个字符函数
1》
.:用来匹配任意一个字符(不包含'\n')学习
>>> m=re.match(r'.','adg') >>> m.group() 'a' >>> m=re.match(r'.','123adg') >>> m.group() '1' >>> m=re.match(r'.','@123adg') >>> m.group() '@' >>> m=re.match(r'.','%@123adg') >>> m.group() '%' >>> m=re.match(r'.','\n%@123adg')# .没法匹配'\n' >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> type(m) <type 'NoneType'> >>> m=re.match(r'{.}','{a}\n%@123adg') >>> m.group() '{a}' >>> m=re.match(r'{.}','{8}\n%@123adg') >>> m.group() '{8}' >>> m=re.match(r'{.}','{8ab}\n%@123adg') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> type(m) <type 'NoneType'> >>> m=re.match(r'{...}','{8ab}\n%@123adg') >>> m.group() '{8ab}'2》
>>> m=re.match(r'{[abc]}','{b}\n%@123adg') >>> m.group() '{b}' >>> m=re.match(r'{[abc]}','{g}\n%@123adg') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> type(m) <type 'NoneType'> >>> m=re.match(r'{[a-z]}','{g}\n%@123adg') >>> m.group() '{g}' >>> m=re.match(r'{[a-zA-Z]}','{H}\n%@123adg') >>> m.group() '{H}' >>> m=re.match(r'[[a-z]]','[d]g%@123adg')#匹配失败,应用'\['来匹配'[' >>> m=re.match(r'([a-z])','(d)kdjkf') #匹配失败,应用'\('来匹配'('3》\w表明一个单词字符(等价于)[A-Za-z0-9_] 即 \w 能够匹配 大写字母 小写字母 数字 下划线!!
>>> m=re.match(r'{[\w]}','{H}\n%@123adg') >>> m.group() '{H}' >>> m=re.match(r'{[\w]}','{h}\n%@123adg') >>> m.group() '{h}' >>> m=re.match(r'{[\w]}','{9}\n%@123adg') >>> m.group() '{9}' >>> m=re.match(r'{[\w]}','{&}\n%@123adg') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> type(m) <type 'NoneType'> >>> m=re.match(r'{[\W]}','{&}\n%@123adg') >>> m.group() '{&}'4》\d匹配一个数字
>>> m=re.match(r'\d','9agd') >>> m.group() '9' >>> m=re.match(r'\d','0agd') >>> m.group() '0' >>> m=re.match(r'\d','ghh0agd') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> m=re.match(r'\D','ghh0agd') >>> m.group() 'g' >>> m=re.match(r'\D','Aghh0agd') >>> m.group() 'A' >>> m=re.match(r'\D','+Aghh0agd') >>> m.group() '+' >>> m=re.match(r'\D','*+Aghh0agd') >>> m.group() '*'5》\s匹配空白(空格,Tab键,‘\n’)
>>> m=re.match(r'\s',' *+Aghh0agd') >>> m.group() ' ' >>> m=re.match(r'\S','*+Aghh0agd') >>> m.group() '*' >>> m=re.match(r'\S','$Aghh0agd') >>> m.group() '$' >>> m=re.match(r'\S','h$Aghh0agd') >>> m.group() 'h'【2】匹配多个字符
1》* 匹配前一个字符0次或者无限次(任意次)
this
>>> m=re.match(r'[A-Z][a-z]*','H') >>> m.group() 'H' >>> m=re.match(r'[A-Z][a-z]*','Hjdkjfksdjkff') >>> m.group() 'Hjdkjfksdjkff' >>> m=re.match(r'[A-Z][a-z]*','Hjdkjf98ksdjkff') >>> m.group() 'Hjdkjf' >>> m=re.match(r'[_a-zA-Z][\w]*','_this') >>> m.group() '_this' >>> m=re.match(r'[_a-zA-Z][\w]*','_') >>> m.group() '_' >>> m=re.match(r'[_a-zA-Z][\w]*','3abc') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group'2》+ 匹配前一个字符1次或者无限次(正整数次)
>>> m=re.match(r'A[0-9]+','A') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> m=re.match(r'A[0-9]+','A8') >>> m.group() 'A8' >>> m=re.match(r'A[0-9]+','A88787gg') >>> m.group() 'A88787'3》?匹配前一个字符0次或者1次
>>> m=re.match(r'[1-9]?[0-9]','100') >>> m.group() '10' >>> m=re.match(r'[1-9]?[0-9]','990') >>> m.group() '99' >>> m=re.match(r'[1-9]?[0-9]','0990') >>> m.group() '0'
>>> m=re.match(r'[a-z0-9]{6}','123abckkk') >>> m.group() '123abc' >>> m=re.match(r'[a-z0-9]{6}','123ab') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> m=re.match(r'[a-z0-9]{6}@163.com','123abc@163.com') >>> m.group() '123abc@163.com' >>> m=re.match(r'[a-z0-9]{6,10}@163.com','123abc@163.comkkkkk') >>> m.group() '123abc@163.com' >>> m=re.match(r'[a-z0-9]{6,10}@163.com','123abc7890@163.comkkkkk') >>> m.group() '123abc7890@163.com' >>> m=re.match(r'[a-z0-9]{6,10}@163.com','123a@163.comkkkkk') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> m=re.match(r'[a-z0-9]{6,10}@163.com','123abc789012@163.comkkkkk') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group'
>>> m=re.match(r'a[0-9]*','a90987abc') >>> m.group() 'a90987' >>> m=re.match(r'a[0-9]*?','a90987abc') >>> m.group() 'a' >>> m=re.match(r'a[0-9]+','a90987abc') >>> m.group() 'a90987' >>> m=re.match(r'a[0-9]+?','a90987abc') >>> m.group() 'a9' >>> m=re.match(r'a[0-9]?','a90987abc') >>> m.group() 'a9' >>> m=re.match(r'a[0-9]??','a90987abc') >>> m.group() 'a'【3】使用正则表达式进行边界匹配
1》^ 匹配字符串的开头(match默认就是从头开始匹配)
2》$ 匹配字符串的结尾url
>>> m=re.match(r'[\w]{6,10}@163.com','abc1234@163.comkkkk') #match默认就是从头开始匹配 >>> m.group() 'abc1234@163.com' >>> m=re.match(r'^[\w]{6,10}@163.com','abc1234@163.comkkkk') #显式指定从头开始匹配 >>> m.group() 'abc1234@163.com' >>> m=re.match(r'^[\w]{6,10}@163.com$','abc1234@163.comkkkk') #指定必须以@163.com结尾 >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> m=re.match(r'^[\w]{6,10}@163.com$','abc1234@163.com') #指定必须以@163.com结尾 >>> m.group() 'abc1234@163.com'
>>> m=re.match(r'\Aimooc[0-9]+','imooc123') >>> m.group() 'imooc123' >>> m=re.match(r'\Aimooc[0-9]+','iimooc123') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> m=re.match(r'[0-9]+imooc\Z','123imooc') >>> m.group() '123imooc' >>> m=re.match(r'[0-9]+imooc\Z','123imoocbook') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group'
1》 | 匹配左右任意一个表达式spa
>>> m=re.match(r'abc|d','abckkk') >>> m.group() 'abc' >>> m=re.match(r'abc|d','dabckkk') >>> m.group() 'd' >>> m=re.match(r'[1-9]?[0-9]|100','0') >>> m.group() '0' >>> m=re.match(r'[1-9]?[0-9]|100','59') >>> m.group() '59' >>> m=re.match(r'[1-9]?[0-9]|100','100') >>> m.group() '10' >>> m=re.match(r'[1-9]?[0-9]$|100','100') >>> m.group() '100'
>>> m=re.match(r'[\w]{4,6}@(163|126|qq).com','abc123@163.comkkk') >>> m.group() 'abc123@163.com' >>> m=re.match(r'[\w]{4,6}@(163|126|qq).com','abc123@126.comkkk') >>> m.group() 'abc123@126.com' >>> m=re.match(r'[\w]{4,6}@(163|126|qq).com','abc123@qq.comkkk') >>> m.group() 'abc123@qq.com' >>> m=re.match(r'[\w]{4,6}@(163|126|qq).com','abc123@xxx.comkkk') >>> m.group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group'
>>> m=re.match(r'<([\w]+>)\1\1','<book>book>book>') >>> m.group() '<book>book>book>' >>> m.groups() ('book>',) >>> m=re.match(r'<([\w]+>)[\w]+</\1','<book>python</book>') >>> m.groups() ('book>',) >>> m.group() '<book>python</book>'4》(?P<name>)给分组起一个别名 (?P=name)引用别名为name的分组所匹配到的字符串
>>> m=re.match(r'<(?P<mark>[\w]+>)[\w]+</\1','<book>python</book>') #经过编号引用 >>> m.group() '<book>python</book>' >>> m=re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>')#经过别名引用 >>> m.group() '<book>python</book>'
使用该模块,首先要导入:import re
1》search(pattern,string,flags=0) 在一个字符串中查找匹配,返回第一个匹配
>>> s='imooc hours=1000' >>> m=re.search(r'\d+',s) >>> m <_sre.SRE_Match object at 0x7fb4ae3da4a8> >>> m.group() '1000' >>> s='imooc c++=1230,python=1200' >>> m=re.search(r'\d+',s) >>> m <_sre.SRE_Match object at 0x7fb4ae3da4a8> >>> m.group() '1230'2》findall(pattern,string,flags=0) 找到匹配,返回全部匹配部分的列表
>>> s='c++=100,java=200,python=300' >>> m=re.search(r'\d+',s)#返回第一个匹配 >>> m <_sre.SRE_Match object at 0x7fb4ae3da578> >>> m.group() '100' >>> info=re.findall(r'\d+',s) #返回全部匹配部分的列表 >>> info ['100', '200', '300']3》sub(pattern,repl,string,count=0,flags=0) substitute 代替,替换
3.1>repl是字符串
>>> s='imooc c++=1000' >>> info=re.sub(r'\d+','1001',s) >>> info 'imooc c++=1001' >>> s='imooc c++=1000,python=2000' >>> info=re.sub(r'\d+','1001',s) >>> info 'imooc c++=1001,python=1001'3.2>repl是函数对象
>>> def add1(match): ... s=match.group() ... value=int(s)+1 ... return str(value) ... >>> s='imooc c++=1000,java=2000,python=3000' >>> re.sub(r'\d+',add1,s) 'imooc c++=1001,java=2001,python=3001'4》split(pattern,string,maxsplit=0,flags=0) 根据匹配 分割字符串,返回 分割后字符串组成的 列表
>>> s='imooc:c c++ python java' >>> re.split(r':| ',s) #指定 ':'或' '做为分隔符(能够指定多个分隔符!!!) ['imooc', 'c', 'c++', 'python', 'java'] >>> s='imooc:c c++ python java,c#' >>> re.split(r':| |,',s) #指定 ':'或' '或','做为分隔符 ['imooc', 'c', 'c++', 'python', 'java', 'c#']
import urllib2,re req=urllib2.urlopen('http://www.imooc.com/course/list') buf=req.read() urllist=re.findall(r'http:.+\.jpg',buf) print urllist i=0 for url in urllist: request=urllib2.urlopen(url) buffer=request.read() f=open('C:\\Users\\91135\\Desktop\\image\\'+str(i)+'.jpg','w') f.write(buffer) f.close() i+=1
至此,咱们对python中的正则表达式有了一个基本的了解,另外两篇介绍正则表达式的文章,推荐学习:
1》点击打开连接
2》点击打开连接