Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3036457
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: Python/Ruby

2014-06-19 16:11:58

   在继续深入学习Python网络编程之前,我们先来补充一下基础知识做些准备。今天会简要介绍几个常用的Python模块,然后给出一些使用的简单示例。闲话少叙,我们进入正题。

一、time模块
   Python标准库中的time模块主要提供系统时间相关的函数,最为常用的莫过于获取系统时间的time.time(),返回值是从新纪元开始以来的秒数,一般不容易读懂,更加人性化的反馈是函数time.asctime()返回制式的系统时间:

点击(此处)折叠或打开

  1. Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
  2. Type "copyright", "credits" or "license()" for more information.
  3. >>> import time
  4. >>> time.time()
  5. 1403161239.485
  6. >>> time.asctime()
  7. 'Thu Jun 19 15:00:45 2014'
  8. >>>
    除此之外,比较常用的还有time.sleep(SECS)函数,该函数可以用来指定系统休眠制定的秒数;time.mktime()jiang 时间元祖转换为本地时间;

二、random模块
   顾名思义,这个模块主要用来提供随机方法之类的函数,比如最为常用的random.random()返回0-1之间的随机浮点值;如果想添加更多的定制要求,可以使用random.uniform()函数,如:

点击(此处)折叠或打开

  1. >>> import random
  2. >>> random.random()
  3. 0.08025849009209518
  4. >>> random.uniform(1, 100)
  5. 82.55138819319161
  6. >>>

三、re模块
   RE(regular expression)即正则表达式,其主要的作用在于构造特定的模式从输入字符串中获取特定的子串。正则表达式的学习很繁琐,也有一定难度,相信接触过Unix编程的小伙伴们应该都多少有感触。所以今天这里先会介绍RE基础,然后是重要的几个函数方法,更加多的细节则在用到的时候再去学习,这样压力或许会小些。
-1. RE基础
   正则表达式借助一些特定的功能字符来实现功能,常用的有:
--1. 通配符:'.',用来表示除换行符以外的任何一个字符,当与重复运算符(*、+)结合时可以表示任意的模式;
--2. 转义符:'\',用来对功能字符进行转义,使其失去其原本的意义,比如'python.org'中需要对'.'进行转义,则需要使用两次'\'才可以:'python\\.org',因为现在需要使得解释器和RE模块转义,因此需要两次;如果使用原始字符串,则可以只使用一次转义:r'python\.org';
--3. 字符集:[a-z],主要用来指定字符的出现范围,比如[a-z]表示26个小写字母均可以;[^abc]表示除了abc之外的所有其他字符;
--4. 选择符和子模式:'p(ython|erl)',符号'|'用来表示二者均符合筛选条件,是逻辑或的关系,而()则定义了子模式,即在()范围内实施选择运算;
--5. 可选项和重复子模式:如r'(http://)?(www\.)?python\.org','?'表示可选项,即前面的项有或没有都符合模式要求;也可以使用'*'表示模式重复0次至多次,或'+'表示模式至少出现一次,或'{m,n}'表示模式重复出现m~n次;

-2. RE模块的内容
   re.compile()函数用来接收正则表达式字符串作为参数,返回模式对象,如果不使用此函数,直接使用后面的search()等函数,Python依旧会先调用compile()函数进行处理,因此出于效率考虑,建议人工调用此函数,避免后期的重复调用;
   re.search(pat, str)在指定的str中搜索模式pat,一旦找到子字符串,则返回MatchObject(值为True),否则返回None(值为False),因此可以用于if结构中;
   re.match(pat, str)函数会在给定字符串的开头进行模式匹配,因此match('p', 'python')返回True,而re.match('p', '')返回False;
   re.findall(pat, str)函数以列表形式返回给定模式的所有匹配项,比如要在指定字符串中查找所有的单词,可以如下编码:

点击(此处)折叠或打开

  1. >>> import re
  2. >>> pat = '[a-zA-Z]+'
  3. >>> text = 'Hello, World, ---, This is a test program, haha?'
  4. >>> re.findall(pat, text)
  5. ['Hello', 'World', 'This', 'is', 'a', 'test', 'program', 'haha']
  6. >>>
    re.escape(str)函数用于脱离正则表达式,即转义字符串中可能的所有正则运算符,如:

点击(此处)折叠或打开

  1. >>> re.escape("")
  2. 'www\\.python\\.org'
-3. 匹配对象和组
   这个部分自己的理解就是如何从匹配到的字符串对象中提取出我们想要的部分呢?比如说,我想提取出中的python部分,即'www.'与'.org'中的部分,所有类似的结构,如何提取呢?

点击(此处)折叠或打开

  1. >>> m = re.match(r'www\.(.+)\.+', '')
  2. >>> m.group()
  3. ''
  4. >>> m = re.match(r'www\.(.+)\..+', '')
  5. >>> m.group()
  6. ''
  7. >>> m.group(1)
  8. 'python'
  9. >>> m.start()
  10. 0
  11. >>> m.start(1)
  12. 4
  13. >>> m.end(1)
  14. 10
  15. >>> m.span(1)
  16. (4, 10)
  17. >>>
    第一行调用了match函数从头开始进行匹配,注意这里使用了原始字符串,因此需要转义时只需要一个'\'就可以了;使用的搜索模式正好是'www\.(.+)\.+',但是运行的结果中却没有'org'部分;
   第二行调用了MatchObject的group(),返回搜索模式中的默认0组,即整个匹配到的字符串;这里需要做些说明,()构成了一个个子模式,每个子模式称之为组,组的序号好取决于它左侧的括号数(所以从0开始记);这里的关键意义是,当根据搜索形式匹配到字符串的时候,可以同样一局搜索模式中的组号提取出不同的部分--而搜索模式的组结构是由我们定义的,因此可以自定义提取出的部分;
   第四行修正了搜索模式,最后多添加了一个'.'作为通配符,结果正确;
   第七行至十六行是一些测试,比如默认的组号0表示字符串本身,组号1表示第一个(),start表示组别的起始位置等;

-4. 贪婪和非贪婪模式
   这里指的是当使用重复运算符的时候,Python默认是“贪婪的”,即会尽可能包含最多的字符,这样就有可能略过字符串中间的特定字符,比如:

点击(此处)折叠或打开

  1. Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
  2. Type "copyright", "credits" or "license()" for more information.
  3. >>> import re
  4. >>> pat = r'\*(.+)\*'
  5. >>> re.sub(pat, r'\1', '*This* is a *test*')
  6. 'This* is a *test'
  7. >>> pat = r'\*(.+?)\*'
  8. >>> re.sub(pat, r'\1', '*This* is a *test*')
  9. 'This is a test'
  10. >>>
    我们的目标是将字符串"*This* is a *test*"中的'*'都替换为''和'',但是由于重复运算符'+'默认是贪婪的,因此会尽可能的多包含字符,因此就忽略了中间的'*',我们需要添加'?'使其成为非贪婪的,从而能够正确实现程序。

四、urllib模块
   网络工作库中无疑最强大的是urllib和urllib2,当只使用简单的下载时,urllib就足够了;而如果要使用HTTP验证或cookie或者要为自己的协议写扩展程序,那么urllib2就是更好的选择了。今天先简单介绍下urllib的基本使用吧!
   

点击(此处)折叠或打开

  1. #A Basic Program for Web...

  2. import urllib

  3. webpage = urllib.urlopen("")

  4. i = 0
  5. while True:
  6.     if (i == 10):
  7.         break
  8.     else:
  9.         print webpage.read(10) + '\n'
  10.         i+=1

  11. urllib.urlretrieve('', 'Baidu_webpage.html')
  12. print 'Download Finished!'
  13. raw_input("Enter for Exit")
--1. 第三行首先导入urllib模块;
--2. 第五行调用了urlopen函数获得一个网络文件对象,使用方法同open获得文件对象;
--3. 第七行到第十三行利用读取前100个字节左右的数据,urlopen返回的文件对象可以使用read()、readline()、readlines()等方法;
--4. 第十五行使用urlretrieve()下载网页到指定的文件,默认与程序代码同目录;


    查看下载的百度主页文件:



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