Regular Expression、regex或regexp,(缩写为RE) 是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
计算机里处理文本和数据是非常重要的事情。
### 一般匹配规则:[¶](http://uliweb.clkg.org/tutorial/view_chapter/192#title_0-0-1)
1 字符串匹配
"abcd" 这种是没有特殊规则,就是完全按照 字符去匹配。 例如:"hello,abcd" 可以匹配。 "hello,abc" 匹配不上。
~~~
>>> import re
>>> re.search("abcd","hello,abcd")
<_sre.SRE_Match object at 0x994e2c0>
>>> re.search("abcd","hello,abdc")
~~~
2 选择匹配 gray|grey ,“gray” 和"grey " 都能匹配上。 或者用 gr(a|e)y 规则来匹配后面2个单词 "gray","grey"。
~~~
>>> print re.search("gray|grey","gray")
<_sre.SRE_Match object at 0x994e2c0>
>>> print re.search("gray|grey","grey")
<_sre.SRE_Match object at 0x994e2c0>
>>> print re.search("gray|grey","grcy")
None
>>> print re.search("gr(a|e)y","gray")
<_sre.SRE_Match object at 0xb77268a0>
~~~
3 数量限定
~~~
‘+’ 加号代表前面的字符必须至少出现一次。(1次、或多次)。例如,“goo+gle”可以匹配google、gooogle、goooogle等;
? 问号代表前面的字符最多只可以出现一次。(0次、或1次)。例如,“colou?r”可以匹配color或者colour;
‘*’ 星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次、或1次、或多次)。例如,“0*42” 可以匹配42、042、0042、00042等。
~~~
~~~
>>> re.search("goo+gle","google")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("goo+gle", "gogle")
>>> re.search("goo+gle", "goooogle")
<_sre.SRE_Match object at 0x994e2c0>
~~~
“?” 例子
~~~
>>> re.search("colou?r","color")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("colou?r","colour")
<_sre.SRE_Match object at 0x994e2c0>
>>> re.search("colou?r","colouur")
>>> #对比 "+"
>>> re.search("colou+r","colouur")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("colou+r","color")
~~~
“*” 例子:
~~~
>>> re.search("goo*gle","google")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("goo*gle","gooogle")
<_sre.SRE_Match object at 0x994e2c0>
~~~
4 [...] 括号里面包含的任意字符
b[aeou]d 匹配"bad","bed","bod","bud"
~~~
>>> re.search("b[aeoud]d","bad")
<_sre.SRE_Match object at 0x994e2c0>
>>> re.search("b[aeoud]d","bed")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("b[aeoud]d","bud")
<_sre.SRE_Match object at 0x994e2c0>
>>> re.search("b[aeoud]d","bcd")
>>> re.search("b[aeoud]d","baed")
~~~
匹配 [0-9],[0-9a-z]
~~~
>>> re.search('b[0-9a-z]d',"b12d")
>>> re.search('b[0-9a-z]d',"b1d")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search('b[0-9a-z]d',"bad")
<_sre.SRE_Match object at 0x994e2c0>
~~~
5 多字符匹配 {n}
[0-9]{3} : []以内的字母、数字在后面字符串中出现的次数。 “hd543”,符合规则。 "hello32rew",不符合规则。
~~~
>>> re.search("[0-9]{3}","hd23")
>>> re.search("[0-9]{3}","hd232")
<_sre.SRE_Match object at 0x92ec2c0>
>>> re.search("[0-9]{3}","hd234")
<_sre.SRE_Match object at 0xb77bee20>
>>>
>>> re.search("[0-9]{4}","hd234")
>>> re.search("[0-9d]{4}","hd234")
<_sre.SRE_Match object at 0x92ec2c0>
~~~
6\. []{m,n}, 按照[]内规则匹配 m---n之间个数,m必须小于n。
7 "." 匹配任何1个字符。
~~~
>>> import re
>>> re.search('b.b',"beb")
<_sre.SRE_Match object at 0xb7280170>
>>> re.search('b.b',"bab")
<_sre.SRE_Match object at 0xb7280368>
>>> re.search('b.b',"badb")
>>> re.search('b..b',"badb")
<_sre.SRE_Match object at 0xb7280170>
>>>
~~~
8 “^” 匹配字符串的开始
~~~
>>> re.search('^bad',"badb")
<_sre.SRE_Match object at 0xb7280368>
>>> re.search('^ad',"badb")
>>> re.search('^.ad',"badb")
<_sre.SRE_Match object at 0xb7280170>
>>> re.search('^..ad',"badb")
>>>
~~~
9
"$" 匹配字符串的结尾
~~~
>>> re.search('adb$',"badb")
<_sre.SRE_Match object at 0xb7280170>
>>> re.search('.db$',"badb")
<_sre.SRE_Match object at 0xb7280368>
~~~
10
~~~
'\d' 匹配数字
‘\D' 匹配非数字
~~~
~~~
>>> re.search('\d',"badec3b2v432")
<_sre.SRE_Match object at 0xb7280368>
>>> re.search('\D',"badec3b2v432")
<_sre.SRE_Match object at 0xb7280170>
>>>
~~~
11
~~~
'\w' 匹配任意数字和字母
'\W' 非数字和字母
~~~
12
~~~
'\s' 匹配任意空白字符,相当于 [ \t\n\r\f\v]
\S 匹配任意非空白字符,相当于 [^ \t\n\r\f\v]
~~~
### 使用方法[¶](http://uliweb.clkg.org/tutorial/view_chapter/192#title_0-0-2)
A)
~~~
compiled_pattern = re.compile(pattern)
result = compiled_pattern.match(string)
~~~
B)
~~~
result = re.match(pattern, string)
~~~
pattern,就是上面提到的规则。
除了match,以为还有几个函数,我们一起做说明: match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况。
search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。 但search 返回第一个匹配的字符串。
split() 将字符串按照规则分成list。如果按照规则里面找不到,就不分割,返回原字符串。
~~~
>>> re.split(":","test:test1:test2")
['test', 'test1', 'test2']
~~~
findall() 函数搜索整个字符串,返回所有匹配项。返回一个list。
sub() 函数 查找并替换
~~~
>>> re.sub("one","num","one world, on dream",1)
'num world, on dream'
>>> re.sub("one","num","one world, one dream",1)
'num world, one dream'
>>> re.sub("one","num","one world, one dream",2)
'num world, num dream'
>>>
~~~
可以:
~~~
>>> p = re.compile( '(one|two|three)')
>>> p.sub( 'num', 'one word two words three words')
'num word num words num words'
~~~
匹配网址的实例:
~~~
#coding=utf-8
import re
urls=r'fdsa<a class="pic" href= "http://www.jeapedu.com ">... </a> '
s = re.findall("<a.*href.*>",urls)
print s
~~~
非贪婪匹配 + 后结束标记
~~~
all_buf = re.findall(r'<a.*?href.*?=(.*?)[> ]',buf)
for n in all_buf:
print n
~~~
简单匹配 @ 后面的用户正则
~~~
#s = "@fdsa;1232"
s = "fdsfds@fdsa你好.1, 232"
a = re.findall("""@(.*?)(?=[;,| '".?])""",s)
print a[0]
~~~
如果@后面没有任何特殊符号,就结束了匹配方法,加了$:
~~~
>>> a= re.compile("@(.*?)(?=[ ,'$]|$)")
>>> print a.findall("@sina @abd, @fds")
~~~
- Python爬虫入门
- (1):综述
- (2):爬虫基础了解
- (3):Urllib库的基本使用
- (4):Urllib库的高级用法
- (5):URLError异常处理
- (6):Cookie的使用
- (7):正则表达式
- (8):Beautiful Soup的用法
- Python爬虫进阶
- Python爬虫进阶一之爬虫框架概述
- Python爬虫进阶二之PySpider框架安装配置
- Python爬虫进阶三之Scrapy框架安装配置
- Python爬虫进阶四之PySpider的用法
- Python爬虫实战
- Python爬虫实战(1):爬取糗事百科段子
- Python爬虫实战(2):百度贴吧帖子
- Python爬虫实战(3):计算大学本学期绩点
- Python爬虫实战(4):模拟登录淘宝并获取所有订单
- Python爬虫实战(5):抓取淘宝MM照片
- Python爬虫实战(6):抓取爱问知识人问题并保存至数据库
- Python爬虫利器
- Python爬虫文章
- Python爬虫(一)--豆瓣电影抓站小结(成功抓取Top100电影)
- Python爬虫(二)--Coursera抓站小结
- Python爬虫(三)-Socket网络编程
- Python爬虫(四)--多线程
- Python爬虫(五)--多线程续(Queue)
- Python爬虫(六)--Scrapy框架学习
- Python爬虫(七)--Scrapy模拟登录
- Python笔记
- python 知乎爬虫
- Python 爬虫之——模拟登陆
- python的urllib2 模块解析
- 蜘蛛项目要用的数据库操作
- gzip 压缩格式的网站处理方法
- 通过浏览器的调试得出 headers转换成字典
- Python登录到weibo.com
- weibo v1.4.5 支持 RSA协议(模拟微博登录)
- 搭建Scrapy爬虫的开发环境
- 知乎精华回答的非专业大数据统计
- 基于PySpider的weibo.cn爬虫
- Python-实现批量抓取妹子图片
- Python库
- python数据库-mysql
- 图片处理库PIL
- Mac OS X安装 Scrapy、PIL、BeautifulSoup
- 正则表达式 re模块
- 邮件正则
- 正则匹配,但过滤某些字符串
- dict使用方法和快捷查找
- httplib2 库的使用