本笔记未加整理,占供自己查看
目录
一、模块
可以自己写一个1.py文件
然后 import 1
如果cal.py定义了add(x,y)
则在另一个文件中
import cal
print cal.add(1,2)
__name__ 内置属性
如果是主体调用 则返回__main__
如果是导入模块里面的,则返回的模块的名字
根据这个可以选择调用的模块
程序导入模块的顺序
先在当前目录中查找,导入模块
再从其他的目录导入
如果要删除,要删除.py和.pyc
-------包------
** 在该目录创建__int__.py文件,则该目录为一个包
import lib.string #即导入lib文件夹的string模块
则lib为一个包
如果条用string里的函数
则 lib.string.replace()
指明哪个包里面的函数
可以用import ,import as,from import
cal.jia()
import cal as c //换一个名字
c.jia()
from cal import jia 从cal包中导入jia()函数
则jia()
二、正则表达式
import re 导入re模块
字符匹配
-普通字符
字母和字符会和自身匹配
-元字符
. ^ $ * + ? {} [] \ | ()
[]
常用来制定一个字符集:[abc] [a-z]
元字符在字符集中不起作用:[akm$],即为普通字符
补集匹配不在区间范围内的字符:[^5]
例
>>>import re
>>>s='abc'
>>>s=r'abc' //取消\转义
>>>re.findall(s,"aaaaaaaaaaa")
[]
>>>re.findall(s,"abcaaaaaabcaaaa")
['abc','abc']
>>>st="top tip tqp twp tep"
>>>res=r"top" 规则
>>>re.findall(res,st)
['top']
>>>res=r'tip'
>>>re.findall(res,st)
['tip']
>>>res=r't[io]p' 进行匹配 tip或者top
>>re.findall(res,st)
['top','tip']
>>>res=r"t[^io]p" //取反
>>>re.findall(res,st)
['tqp','twp','tep']
^ 行首
匹配行首。
例子
>>>s='hello world,hello boy'
>>>r = r"hello"
>>>re.findall(r,s) 用r规则匹配s字符串
['hello','hello']
>>>r=r"^hello"
>>>re.findall(r,s) s中hello必须在行首,否则返回[]
['hello']
$ 行尾
>>>r=r"boy$"
>>>re.findall(r,s)
['boy']
>>>r=r"x[0123456789]x"
>>>re.findall(r,'x1x')
>>>r=r"x[0-9]x" 更方便 或者[a-zA-Z0-9]
>>>r=r"^abc" 行首
>>>re.findall(r,"abc")
['abc']
>>>re.findall(r,'aa abc')
[]
>>>re.findall(r,'^abc')
[]
>>>re.findall(r,'^abc ^abc ^ab') 补集
[]
如何将^作为普通字符 \^ 转义
\ 转义
\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]
匹配010-12345678电话号码
>>>r=r"^010-\d\d\d\d\d\d\d\d\d"
>>>re.findall(r,'010-87654321')
['010-87654321']
#从过后面的数字不够,则不能匹配
>>>r=r"^010-\d{8}" 重复\d 8次
*
>>>r=r"ab*" 将*前面的重复0到多次,即b可以出现0次或多次
>>>re.findall(r,'a')
['a']
>>>re.findall(r,'ab')
['ab']
>>>re.findall(r,'abbbbbb')
['abbbbbb']
+
和*的区别是至少有一次
>>>r=r"ab+"
>>>re.findall(r,'a')
[]
>>>re.findall(r,'ab')
['ab']
>>>re.findall(r,abbb)
['abbb']
? ?前面的字符可有可无,一次或0次
匹配010-12345678电话号码,且中间的-可有可无
>>>r=r"^010-*\d{8}$"
>>>re.findall(r,"01012345678")
["01012345678"]
>>>re.findall(r,'010-12345678')
['010-12345678']
>>>re.findall(r,'010--12345678')
['010--12345678'] 不好
则
>>>r=r"^010-?\d{8}"
>>>re.findall(r,'010--12345678')
[]
贪婪模式
>>>r=r'ab+'
>>>re.findall(r,'abbbbbbbbbb')
['abbbbbbbbbb'] //做最大的模式,及贪婪
>>>r=r'ab+?' //取消贪婪模式
>>>re.findall(r,'abbbbbbbbbb')
['ab']
{m,n} 知道m个,至多n个
>>>r=r'a{1,3}'
>>>re.findall(r,'a')
['a']
>>>re.findall(r,'aa')
['aa']
>>>>>>re.findall(r,'aaaa')
['aaa','a'] 分割
可以忽略m或者n
忽略m代表0-n
忽略n代表m-20亿
>>>r=r"\d{3,4}-?\d{8}"
>>>p_tel=re.compile(r) 编译产生一个匹配对象
>>>p_tel.findall('010_12345678')
['010-12345678']
>>>p_tel.findall('010_123456789')
['010-12345678']
//匹配csvt 不区分大小写
>>>csvt_re=re.compile(r'csvt',re.I)
>>>csvt_re.findall('Csvt')
['Csvt']
执行匹配
match() 特点:匹配数据在行首
>>>x=csvt_re.match('csvt hello')//匹配成功返回匹配对象
serch() 任何位置都可以
findall() 返回列表
finditer() 返回迭代器
>>>x=csvt_re.finditer()
>>>x.nest() 返回match对象
match对象的方法
group()
>>>x.group()
['csvt']
start()
end()
span()
re顶级函数
sub()
>>>s="hello csvt"
>>>s.replace('csvt','python')
'hello python'
sub可以实现上面功能
>>>rs=r'c..t'
>>>re.sub(re,'python','csvt caat cvvt cccc')
'python python python cccc'
subn()
>>>re.sub(re,'python','csvt caat cvvt cccc')
('python python python cccc',3) //返回匹配的个数
split() //切割
像前面的切割ip的例子
>>>s="123+456-789*000"
>>>re.splite(r'[\+\-\*/]',s) 转义
['123','456','789','000']
dir(re) 列出res的属性和方法
help(re) 查看re模块手册
编译标志
Dotall,S 使.匹配包括换行在内的所有字符
Ignorecase,I 使匹配对大小写不敏感
Locale,L 做本地化识别(locale-aware)匹配.法语等
Multiline,M 多行匹配,影响^和$
Verbose,X 能够使用REs的verbose状态,使之被组织得更清晰易懂
S
>>>r=r"csvt.net"
>>>re.findall(r,'csvtonet')
['csvtnet']
>>>re.findall(r,'csvt\nnet')
>>>[]
>>>re.findall(r,'csvt\nnet',re.S)
>>>['csvt\nnet']
M
>>>s="""
hello csvt
csvt hello
hello csvt hello
csvt hehe
"""
>>>r=r'^csvt'
>>>re.findall(r,s)
[]
>>>re.findall(r,s,re.M)
['csvt','csvt']
X
>>>tel=r"""
\d{3,4}
-?
\d{8}
"""
>>>re.findall(tel,'010-12345678')
>>>re.findall(tel,'010-12345678',re.X)
['010-12345678']
分组 ( he )
匹配邮箱地址
>>>email=r"\w{3}@\w+(\.com|\.cn)"
>>>re.match(email,'zzz@csvt.com')
#匹配成功 , 如果为‘空’则没有匹配成功
>>>re.findall(email,'zzz@csvt.com')
['.com'] #优先返回分组内数据
s="hello src=csvt yes hello src=pythont yes""
>>>r=r'hello src=.+ yes'
>>>re.findall(r,s)
['hello src=csvt yes','hello src=pythont yes']
>>>r=r'hello src=(.+) yes'
>>>re.findall(r,s)
['csvt python']
爬虫: 下载贴吧得图片
查看源代码
图片: img标签
获取src后面得数据
获取源代码
vim getjpg.py
#!/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="(.*?\.jpg)" width'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' %x);
x+=1
html = getHtml(<网址>)
getImg(html)