异常处理和正则表达式

来源:互联网 发布:广州恒大淘宝俱乐部 编辑:程序博客网 时间:2024/06/05 15:22

#########异常处理######


#!/usr/bin/env python
#coding:utf-8
_author_ = 'hxr'

##python的异常处理机制,try ...  expect....  finally....

try:                    ##用来把可能存在异常的代码放在该语句块中
    print 'starting...'
    li=[1,2,3]
    dic={'name':'hello'}
    print dic['hello']
    print li[3]
    print a     ##NameError

except BaseException,e :  ##不确定错误种类是哪种,使用父类方法来捕获异常
    print e
# except IndexError:      ##捕获指定的异常,如果异常为IndexError,则执行下面的语句
#     print 'index out of list length'
# except NameError:
#     print 'name is not define'
else:                   ##没有任何异常则执行下面的语句
    print 'no error'
finally:                ##无论是否存在异常,均会执行以下语句
    print 'end...'

####函数中出现的异常

def fun1(s):
    return fun2(s)*2
def fun2(s):
    return 10/s
def main():
    try:
        print fun1('10')
    except BaseException,e:  ##错误类型为TypeError
        print e
main()
运行结果:
unsupported operand type(s) for /: 'int' and 'str'

####将异常写入文件中

import logging      ##导入模块(将错误写入到对应文件中)
logging.basicConfig(filename='err.log') ##建立对应文件
def fun1(s):
    return fun2(s)*2
def fun2(s):
    return 10/s
def main():
    try:
        print fun1('10')
    except Exception as e:
        logging.exception(e)    ##将错误信息写入文件中
        print e
main()

####自定义错误类型

class MyError(BaseException): ##自定义的错误类型
    pass
def fun1(s):
    return fun2(s)*2
def fun2(s):
    return 10/int (s)
def main():
    try:
        print fun1('0')
    except ZeroDivisionError as e:
        raise  MyError       ##更改错误名称
        print e
main()

####调试

-print 打印出你认为可能出错的变量
-assert 断言,格式
    assert 变量名==值[不符合预设条件时执行的语句]
def foo(s):
    n = int(s)
    return 10 / n

assert foo(5) == 1 ##错误就结束,正确就接着执行
print 'hello'

####记录错误信息级别并输出到文件中

import logging
##debug ,info,warning,error 指定记录信息的级别
logging.basicConfig(filename='logging.log',level=logging.WARNING)
def foo(s):
    n = int(s)
    logging.info('n=%d'%n)  ##对应级别写入文件中
    logging.warning('n=%d,,,,,warn'%n)
    return 10 / n
def main():
    foo('10')
main()
####pdb 调试方法
在命令行中执行
python -m pdb error.py ##进入调试
n(下一步,单步执行)
p 变量名 (查看变量)
q(退出)
c(继续执行,直到遇到断点)
####pdb断点调试
import pdb
n=1
print n
pdb.set_trace()  ##设置断点
print 'hello'
pdb.set_trace()  ##设置断点
print 'world'
s=2
print s
在命令行中执行
python error.py ##进入调试

################正则表达式############

基本模式
• 字面模式: 就是字面长量,就代表其本身
• . 匹配任何字符
• \w 匹配一个单词(字母,数字) \W 匹配非字母
• \s 匹配空白 \S 匹配非空白字符
• \d 匹配数字
• ^ 开头 $ 结尾
• \ 转义字符
次数的匹配
次数的匹配 , 匹配其前面的字符出现的次数 :
• * 0 次或多次
• + 一次或多次
• ? 零次或一次
• {n} 出现 n 次
• {m,n} 出现 m 到 n 次
中括号
• 中括号用于指向一个字符集合
• 中括号可以使用元字符
• 中括号中的. 表示其字面意思
[a-z] [A-Z] [0-9] [A-Za-z]
• [0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线;
• [0-9a-zA-Z\_]+ 可以匹配至少由一个数字、字母或者下划线组成的字
符串;
• [a-zA-Z\_][0-9a-zA-Z\_]{0, 19} 更精确地限制了变量的长度是 1­20
个字符;
•A|B 可以匹配 A 或 B
•^\d 表示必须以数字开头
• \d$ 表示必须以数字结束

#######判断邮件名是否合法#####

#!/usr/bin/env python
#coding:utf-8
_author_ = 'hxr'
import re
r= r'\w+@.+[\.cn|\.com]$'  ##规则的定义,实现判断邮件名称是否合法
s='heo@ewiqeh.cn'
print re.findall(r,s)
r1=r'^[0-9]{3}\-[0-9]{7}'  ##规则,判断电话号码是否合法
s='029-1234567'
print re.findall(r1,s)

#########re模块#######

• re.match(p,text) :p 为正则表达式模式, text 要查找的字符串,会返回一个match 对象
• re.search(p,text) : 只要在 text 中匹配到了 p 就返回,只返回第一个匹配到的
• re.findall(p,text) :将能匹配上的全返回,会返回一个 list
• re.split(p,text) : 按照 p 匹配,并且以匹配到的字符为分隔符切割 text, 返回一个切割后的 list
• re.sub(p,s,text) : 替换,将 p 匹配到的字符替换为 s.
• pattern = re.compile(p) 先编译 p 模式,当正则表达式模式比较复杂的时候,会先编译,然后再使用

#########获取网页上的图片

#!/usr/bin/env python
#coding:utf-8
_author_ = 'hxr'
import re
import urllib,urllib2
def GetHtml(url):        ##下载获得网页
    try:            ##检测异常
        page=urllib.urlopen(url)
        html=page.read()
    except urllib2.URLError,e:
        print 'Downloaad error ... %s' %e
    return html
def GetImg(html):        ##根据网页获得图片地址,并下载
    img_re=r'src="(.+\.jpg)"'
    img_recom=re.compile(img_re)
    imglist=re.findall(img_recom,html)
    x=1
    for imgurl in imglist:
        urllib.urlretrieve(imgurl,"%s.png" %x)
        x+=1
html=GetHtml('http://172.25.254.252/')
GetImg(html)