您的位置:首页 > 编程语言 > Python开发

八、Python正则表达式

2016-07-19 15:46 441 查看
Python正则表达式
一、正则表达式(或RE)是一种小型的、高度专业化的编程语言
--- 可以为想要匹配的相应字符串集指定规则
--- 该字符串集可能包含英文语句、e-mail地址、命令或者任何你想搞定的东西
--- 可以问诸如“这个字符串匹配该模式吗?”
--- “在这个字符串中是否有部分匹配该模式呢?“
--- 你也可以使用RE以各种方式来修改或分割字符

正则表达式模式被编译成一系列的字节码,然后有用C编写的匹配引擎执行
正则表达式语言相对小型和受限(功能有限)
--并非所有字符串处理都能用正则表达式完成

二、 字符匹配
--普通字符
-大多数字母和字符一半都会和自身匹配
-如正则test会和字符串“test“完全匹配
--元字符
  . ^ $ * + ? {} [] \ | ()
[] 常用来指定一个字符集:[abc] [a-z];元字符在字符集中不起作用:[akm$];补集匹配不在区间范围内的字符:[^5]
>>> import re
>>> s = r'abc'
>>> re.findall(s,"abcabcaaaaabc")
['abc', 'abc', 'abc']
>>> r = "t[abc$]"
>>> re.findall(r,'ta')
['ta']
>>> re.findall(r,'tax')
['ta']
>>> re.findall(r,'t$')
['t$']
>>> r = "x[0-9a-zA-Z]x"
>>> re.findall(r,'x1x x9x xzx xAx')
['x1x', 'x9x', 'xzx', 'xAx']
^ 匹配行首
$ 匹配行尾
\ 反斜杠后面可以加不同的字符以表示不同特殊意义
\d 匹配任何十进制数:相当于类[0-9]
\D 匹配任何非数字字符: 相当于类[^0-9]
\s 匹配任何空白字符: 相当于类[\t\n\r\f\v]
\S 匹配任何非空白字符: 相当于类[^\t\n\r\f\v]
\w 匹配任何字母数字字符: 相当于类[a-zA-Z0-9]
\W 匹配任何非字母数字字符: 相当于类[^a-zA-Z0-9]

三、正则表达式使用:
re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用他们来进行匹配
编译正则表达式
>>> import re
>>> p = re.compile('ab*')
>>> print p
<_sre.SRE_Pattern object at 0x7fd77e27f960>

>>> import re
>>> r1 = r"\d{3,4}-?\d{8}"
>>> re.findall(r1,"010-12345678")
['010-12345678']
>>> p_tel = re.compile(r1)
>>> p_tel.findall("010-12321312")
['010-12321312']

>>> csvt_re = re.compile(r'csvt',re.I) #不区分大小写
>>> csvt_re.findall('csVT')
['csVT']

四、执行匹配
match() 决定RE是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个RE匹配的位置
>>> csvt_re.match('csvt hello')
<_sre.SRE_Match object at 0x7fd77e1b8920>
>>> csvt_re.match('hello csvt')
>>> csvt_re.search('hello csvt heelo')
<_sre.SRE_Match object at 0x7fd77e1b8988>
>>> csvt_re.search('csvt hello')
<_sre.SRE_Match object at 0x7fd77e1b8920>

findall() 找到RE匹配的所有子串,并把他们作为一个列表返回
finditer() 找到RE匹配的所有子串,并把他们作为一个迭代器返回

MatchObject实例方法
group() 返回被RE匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配(开始,结束)的位置
>>> m = csvt_re.match('csvt hello')
>>> if m:
... print 'Match found:',m.group()
... else:
... print 'No match'
...
Match found: csvt

五、正则表达式内置属性
S 使.匹配包含换行在内的所欧字符
>>> r1 = r"csvt.net"
>>> re.findall(r1,'csvtonet')
['csvtonet']
>>> re.findall(r1,'csvt\nnet',re.S)
['csvt\nnet']

I 使匹配对大小写不敏感
L 做本地化识别匹配
M 多行匹配,影响^和$
>>> s = """
... hello csvt
... csbt hello
... hello csvt hello
... """
>>> r = r"^csvt"
>>> s
'\nhello csvt\ncsbt hello\nhello csvt hello\n'
>>> r = r"^csbt"
>>> re.findall(r,s,re.M)
['csbt']

X 能够使用REs的verbose状态,使之被组织得更清晰易懂
>>> tel = r"""
... \d{3,4}
... -?
... \d{8}
... """
>>> tel
'\n\\d{3,4}\n-?\n\\d{8}\n'
>>> re.findall(tel,'010-12345678',re.X)
['010-12345678']

六、正则分组
通过用()来获取所需值
>>> print s
hhsdj hello src=csvt yes jsdjsd
sdfsdfa src=123 yes sdfa
src=234 yes
hello src=python yes kas
>>> r1 = r"hello src=.+ yes"
>>> re.findall(r1,s)
['hello src=csvt yes', 'hello src=python yes']
>>> r1 = r"hello src=(.+) yes"
>>> re.findall(r1,s)
['csvt', 'python']

七、练习:利用正则表达式下载网页中所有的图片(小爬虫)
#!/usr/bin/python
import re
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(http.+?\.jpg)"'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
print imglist
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' % x)
x = x + 1
html = getHtml("http://www.webkaka.com/tutorial/zhanzhang/2015/040210/")
getImg(html)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python正则表达式