《深入理解Python》读书笔记Ⅳ

1、正则表达式

(1)在Python中,所有和正则表达式相关的功能都包含在re模块中。

(2)字符$表示”字符串的末尾“,字符尖号^表示”字符串的开始“。

(3)‘\b'表示”单词的边界必须在这里“。

(4)只要处理正则表达式,就使用原始字符串,如r'\t'是一个真正的反斜线字符'\',紧跟着一个字母't'。

(5)re模块的关键是一个search函数,该函数有两个参数,一个是正则表达式(pattern),一个是字符串,函数视图匹配正则表达式。如果发现一个匹配,search函数返回一个拥有多种方法可以描述这个匹配的对象,如果没有发现匹配,search函数返回一个None。

(6)'\d'表示”任何一个数字“(0到9),’\d{3}'中的'{3}'表示”精确匹配三个数字“。

(7)groups函数返回一个元组,元组中的元素是正则表达式中定义的组。

(8)'\D'表示”匹配任意字符,除了数字位“,'+'表示”1个或者多个“,'*'表示”0或者多个“。


2、正则表达式

 •   ^  匹配字符串的开始。 
 •   $  匹配字符串的结尾。 
 •   \b  匹配一个单词的边界。 
 •   \d  匹配任意数字。 
 •   \D 匹配任意非数字字符。 
 •   x?  匹配一个可选的 x 字符 (换言之 ,它匹配 1 次或者 0 次 x 字符)。 
 •   x*  匹配0 次或者多次 x 字符。 
 •   x+  匹配1 次或者多次 x 字符。 
 •   x{n,m} 匹配 x 字符 ,至少 n 次 ,至多 m 次。 
 •   (a|b|c) 要么匹配 a  ,要么匹配 b  ,要么匹配 c。 
 •   (x) 一般情况下表示一个记忆组 (remembered g roup)。可以利用 re.search  函数返回对象的 groups()  函数获取它的值。 

在需要多次使用同一个正则表达式的情况下,应该将它进行编译以获得一个pattern 对象,然后直接调用这个 pattern 对象的方法。

 import re
pattern = '^M?M?M?$'
compiledPattern =re.compile(pattern)          #获得一个pattern对象

compiledPattern.search('M')  

建议使用{m,n} 语法来查找可选重复字符。


3、urllib模块是标准Python库的一部分,它包含了一些函数,可以从基于互联网的 URL (主要指网页) 来获取信息并且真正取回数据。urllib 模块最简单的使用是提取用 urlopen 函数取回的网页的整个文本。打开 一个URL  同打开一个文件相似。urlopen 的返回值是像文件一样的对象,它 具有一个文件对象一样的方法。使用由 urlopen 所返回的类文件对象所能做的最简单的事情就是 read  ,它可 以将网页的整个 HTML 读到一个字符串中。这个对象也支持 readlines 方法 , 这个方法可以将文本按行放入一个列表中。当用完这个对象,要确保将它 close ,就如同一个普通的文件对象。


4、Python 使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个  dictionary  ,它的键字就是变量名 ,它的值就是那些变量的值。实际上,名字 空间可以像 Python 的 dictionary 一样进行访问 。 在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间。每个函 数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量 ,包括函数的参数和局部定义的变量。每个模块拥有它自已的名字空间,叫做全局 名字空间,它记录了模块的变量 ,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。 

局部名字空间可以通过内置的locals函数来访问。全局(模块级别)名字空间可以通过内置的globals函数来访问。

def foo(arg):

      x = 1

     print locals()

foo(7)       #打印{'arg':7,'x':1}

locals 返回一个名字/值对的 dictionary。这个 dictionary  的键字是字符串形式的变量名字 ,dictionary  的值是变量的实际值。

locals 是一个返回 dictionary  的函数,这个dictionary是局部名字空间的拷贝,对它进行改变并不会影响局部名字空间中的变量值。而globals 返回实际的全局名字空间,而不是一个拷贝,对globals所返回的dictionary的任何改动都会直接影响到全局变量。


5、基于dictionary的字符串格式化

params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} 
"%(pwd)s" % params                         #返回'secret' 
"%(pwd)s is not a good password for %(uid)s" % params            #返回'secret is not a good password for sa' 
"%(database)s of mind, %(database)s of body" % params           #返回'master of mind, master of body'

这种字符串格式化形式不用显式的值的 tuple ,而是使用一个dictionary ,params。并且标记也不是在字符串中的一个简单 %s  ,而是包含了一个用括号包围起来的名字。这个名字是 params dictionary 中的一个键字 ,所以 %(pwd)s 标记被替换成相应的值 secret 。 
基于 dictionary 的字符串格式化可用于任意数量的有名的键字。每个键字必须在一个给定的 dictionary  中存在,否则这个格式化操作将失败并引发 一个 KeyError  的异常。甚至可以两次指定同一键字 ,每个键字出现之处将被同一个值所替换。

使用内置的 locals  函数是最普通的基于 dictionary 的字符串格式化的应用。使用 locals 和 globals 函数,通过提供变量的字符串名字可以动态地得到任何变量的值。getattr  函数允许通过提供函数的字符串名来动态地访问任意的函数。

6、也可以在一个函数中导入模块,这意味着导入的模块只能在函数中使用。


7、capitalize函数:只是将一个字符串的第一个字母变成大写 ,将其它的字母强制变成小写。


8、Python提供了一个强大工具——sgmlib.py,可以通过将HTML结构转变为一种对象模型来处理。


9、‘from xml.dom import minidom’表示“在 xml目录中查找 dom 目录 ,然后在这个目录中查找 minidom 模块,接着导入它并以 minidom 命名 ”。minidom.pars e 接收一个参数并返回 XML文档解析后的表示形式。从 minidom.pars e 返回的对象是一个 Document 对象,它是 Node 类的一个子对象。这个 Document 对象是联锁的 Python 对象的一个复杂树状结构的根层次,这些 Python 对象完整表示了传给 minidom.parse 的 XML 文档。toxml 是 Node 类的一个方法,它打印出Node表示的XML。

个 Node 都有一个 childNodes 属性 ,它是一个 Node 对象的列表。一个  Document 只有一个子节点 ,即 XML 文档的根元素。Node 类有一个 firstChild 属性 ,它和childNodes[0]具有相同的语义。(还有一个lastChild 属性 ,它和childNodes[-1]具有相同的语义。)

‘硬回车也算作子节点。


10、为了创建一个 unicode 字符串而不是通常的 ASCII 字符串,要在字符串前面加上字母 “u”。print 函数会尝试将 unicode 字符串转换为 ASCII 从而打印它。如果unicode 字符串包含非 ASCII 字符,Python 会引发 UnicodeError 异常。

sitecustomize.py 是一个特殊的脚本,Python 会在启动的时候导入它,所以在其中的任何代码都将自动运行。setdefaultencoding 函数设置默认编码。

# - *- coding: UTF-8 - *-                 #这个声明定义了.py文件的编码为UTF-8


11、getElementsByTagName 接收一个参数,即要找的元素的名称。它返回一个Element 对象的列表,列表中的对象都是有指定名称的 XML 元素。

每个 Element 对象都有一个 attributes 属性 ,它是一个 NamedNodeMap 对象。 NamedNodeMap 是一个行为像字典的对象。

Attr 对象完整代表了单个 XML 元素的单个 XML 属性。属性的名称 (与你在Element.attributes NamedNodeMap 伪字典中寻找的对象同名) 保存在 Attr.name 中。这个 XML 属性的真实文本值保存在 Attr.value  中。


12、类文件对象是任意一个带有 read 方法的对象,这个方法带有一个可选的 size 参数,并返回一个字符串。调用时如果没有 size 参数,它从输入源中读取所有东西并将所有数据作为单个字符串返回;调用时如果指定了 size 参数,它将从输入源中读取 size 大小的数据并返回这些数据;再次调用的时候,它从余下的地方开始并返回下一块数据。

把类文件对象传递给 minidom.parse,它顺从地调用对象的 read 方法并解析 read 方法返回的 XML 数据。minidom 有一个方法,parseString,它接收一个字符串形式的完整 XML 文档作为参数并解析这个参数。

可以使用 minidom.parse 函数来解析本地文件和远端 URL。


13、StringIO 模块只包含了一个类,也叫 StringIO,它允许你将一个字符串转换为一个类文件对象。 StringIO 类在创建实例时接收字符串作为参数。


14、如何使用同一个函数,minidom.parse,来解析一个保存在web 页面上、本地文件中或硬编码字符串中的 XML 文档?对于一个 web 页面,使用 urlopen 得到类文件对象;对于本地文件,使用 open;对于字符串,使用StringIO。


15、stdout 是一个类文件对象;调用它的 write 函数可以打印出给定的任何字符串。stdout 和 stderr 把它们的输出发送到相同的地方:Python IDE或者终端 。和 stdout 一样,stderr 并不添加硬回车;如果需要,要自己加上。

import sys 
print  'Dive in'                                          
saveout = sys.stdout                                     
fsock = open('out.log', 'w')                             
sys.stdout = fsock             #所有后续的输出都会被重定向到刚才打开的新文件上“out.log”                             
print  'This message will be logged instead of displayed'                #这样只会将输出结果“打印”到日志文件中;在 IDE 窗口中或在屏幕上不会 看到输出结果
sys.stdout = saveout                                     #设回原来的方式
fsock.close() 

始终在重定向前保存 stdout  ,这样的话之后还可以将其设回正常。


16、每个节点都有一个 nodeType 属性,它可以是 ELEMENT_N ODE, TEXT_NODE ,COMMENT_NODE,或者其它值。


17、Python 有一个叫 random 的模块,它包含了好几个有用的函数。random.choice 函数接收一个任意数量条目的列表并随机返回其中的一个条目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值