Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2108940
  • 博文数量: 333
  • 博客积分: 10161
  • 博客等级: 上将
  • 技术积分: 5238
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-19 08:59
文章分类

全部博文(333)

文章存档

2017年(10)

2014年(2)

2013年(57)

2012年(64)

2011年(76)

2010年(84)

2009年(3)

2008年(37)

分类: LINUX

2013-12-16 09:36:15

包和模块
模块常用在代码封装
python脚本以.py结尾
python脚本都可以称作模块(module)

python模块默认存放位置
rpm -ql python
/usr/lib64/python2.6/ 大量.py文件

但是在.py文件中有可能有执行代码,我们只想使用其中一个函数
import example
example.fun1()

模块名与脚本文件名相同
例如我们编写了一个名为item.py脚本,则可在另外一个脚本中用import items语句来导入它

* python模块可以按目录组织为包
* 创建一个包的步骤是:
- 建立一个名字为包名字的文件夹
- 在该文件夹下创建一个__init__.py文件
- 根据需要在该文件夹下存放脚本文件,已编译扩展及子包
- import pack.m1, pack.m2, packl.m3

包是一堆按目录组织的模块和子包,目录下的__init__.py文件存放了包的信息;
可以用import,import as, from import等语句导入模块和包。

import cal as c
from cal import add

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

字符匹配
- 普通字符
 *  大多数字幕和字符一般都会和自身匹配
 * 如果正则表达式test会和字符串“test”完全匹配
- 元字符
. . ^ $ * + ? {} [] \ | ()

* []
 - 常用来指定一个字符集: [abc]; [a-z]
 - 元字符在字符集中不起作用: [akm$]
 - 补集匹配不在区间范围内的字符: [^5]
s='abcd'
import re
re.findall("a[bc]",s)

* ^ 匹配行首
* $匹配行尾

* \
 - 反斜杠后面可以加不同的字符,以表示不同特殊意义
   \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]

 - 也可以用于取消所有的元字符: \[ 或 \\

* 重复
- 正则表达式的第一功能就是能够匹配不定长的字符集,另外一个功能就是你可以指定正则表达式的一部分的重复次数

* *
- 指定前一个字符可以被匹配0次或更多次,而不是只有一次,匹配引擎会试着重复尽可能多的次数(不超过正说界定范围,20亿)
- a[abcd]*b

* + 
- 表示匹配一或更多次
- 注意*和+之间的不同;*匹配0次或更多次,所以可以根本就不出现,而+则要求至少出现一次

* ?
- 匹配一次货零次;你可以认为它用于标识某事物是可选的

r=r"^010-\d{8}"
r=r"^\d{3}-?\d{8}"
re.compile(r) 对于经常使用的规则可以进行编译,速度会比未编译的速度快很多
csvt_re = re.compile(r'csvt',re.I) 不区分大小写
csvt_re.findall('CsVt')


- re.compile()也可接受可选的标志参数,常用来实现不同的特殊功能和语法变更

- 反斜杠的麻烦
字符串前加“r”就不会被任何特殊方式处理

\section 要匹配的字符串
\\section 为re.compile取消反斜杠的特殊意义
"\\\\section" 为“\\section”的字符串实值(string literals)取消反斜杠的特殊意义

* 执行匹配
- ‘RegexObject’实例有一些方法和属性,完整的列表可查阅Python Library reference

match() 决定RE是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个RE匹配的位置
findall() 找到RE匹配的所有子串,并把它们作为一个列表返回
finditer() 找到RE匹配的所有子串,并把它们作为一个迭代器返回

- MatchObject实例方法
group() 返回被RE匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元祖包含匹配(开始,结束)的位置

* 实际程序中,最常见的作法是将'MatchObject'保存在一个变量,然后检查它是否为none
#!python
p = re.compile()
m = p.match('string goes here')
if m:
print 'Match found:', m.group()
else
print 'No match'

* 模块级函数
- re模块也提供了顶级函数调用,如match(),search(),sub(),subn(),split(),findall()等

---------------------
re属性-分组

* 编译标志 - flags
DOTALL,S 使.匹配包括换行在内的所有字符
IGNORECASE,I 使匹配对大小写不敏感
LOCALE,L 做本地化识别(locale-aware)匹配法语等‘e’或‘c’
MULTILINE,M 多行匹配,影响^和$
VERBOSE,X 能够使用REs的verbose状态,使之被组织得更清晰易懂

>>> s = """
... hello csvt
... csvt hello
... hello nsun
... hello csvt nsun
... csvt hehe
... """

>>> re.findall(r,s,re.M)
['csvt', 'csvt']

--------
>>> re.findall(r,s,re.M)
['csvt', 'csvt']
>>> tel = r"""
... \d{3}
... -?
... \d{8}
... """


爬虫实例: 从网页上下载图片

#!/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)\" pic_ext"
     imgre = re.compile(reg)
     imglist = re.findall(imgre,html)
x = 0
for imgurl in imglist:
     urllib.urlretrieve(imgurl,"%s.jpg" %x)
     x += 1
return x

html = getHtml("")
print getImg(html)

 


阅读(932) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~