Tag Archives: python

python官方文档阅读笔记[1] 字符串的format 正则表达式

目前读到standard library 关于字符串和正则的部分,这一期主要讲述一下python中的字符串format和正则,我认为是较为精华的部分。如果只是对那些知识进行罗列,或者直接拷贝,那我觉得是违背一个博客的初衷的。我将官方文档的内容进行了一小点的二次加工,所以可能会有问题,也请看官看到的能够指正,谢谢。

看的是2.7版,链接 如果需要看正解,务必以官方文档为准。

https://docs.python.org/2.7/library/strings.html

以下主要我会讲解冷门的例子中的一些解释,注重一下实践中的学习:

  • 字符串的format各进制的整数的输出的例子

[code lang=”python”]
>>> width = 5
>>> for num in range(5,12):
… for base in ‘dXob’:
… print ‘{0:{width}{base}}’.format(num, base=base, width=width),
… print

5 5 5 101
6 6 6 110
7 7 7 111
8 8 10 1000
9 9 11 1001
10 A 12 1010
11 B 13 1011
[/code]

解释一下,使用带大括号的字符串使用string的format方法,每一个大括号的元素将会对应format中的参数。

0就会对应num width对应width base对应base
width永远是5,表示每次的输出字符串有5的宽度,使这些内容能够输出成表格形式,且默认右对齐。

如果有嵌套的大括号,其实就可以认为是一个不断迭代解开括号的过程,以第一行第一列为例,字符串即为’5:{width}{base}’.format(base =’d’, width = 5) 也就是5以有符号整数形式输出。其余的X为以16进制输出,o则是以八进制输出,b则是以二进制输出。

  • 正则表达式 capturing与non-capturing

正则表达式是一个伟大的发明,在文字处理时,可以做到使用一个很短的正则表达式表达一个复杂的逻辑来进行搜索、替换、匹配的操作,在编译过程中进行词法分析就经常可以用到正则表达式的一个方式。

python作为一个脚本语言,标准库中对操作字符串处理的正则表达式自然是十分强大而且方便,学习这一方面主要是2点,第1点是正则表达式的语法,想必这是每个程序员或者hacker的基本功,不仅适用于python,还适用于任何其他的变成语言和工具。第2点就是python的相关API的使用。

按照惯例贴上官方文档的链接,请以官方文档为准
https://docs.python.org/2.7/library/re.html

最简单的[]的用法,{,}的用法,|的用法,常用的后加个字母代表的意义也就不说了,今天主要讲讲capturing和non-capturing
使用(…)括起来的在很多情况下可以作为一个捕获型的子匹配,会将这个子匹配存在内存中,在这之后可以用num来引用这个匹配的字符串表示将这个字符串再重复一遍,达到一个动态变化的作用,可以用于如XML的标签的匹配上,而且还可以在Python使用时使用match对象中的group来对(…)中的内容进行提取。

但是在(?:…)这种写法中,这个正则表达式不会保存括号中的内容进行下一次匹配。

举个例子:
下列第一行中,abc标签用def闭合(不符合XML的语法,但是举例子),在匹配1时,会匹配捕获到的abc的内容,所以第一行中没有匹配上
第二行中abc标签闭合能与abc完美的符合。
第三行中,因为?:开始的字符串匹配不会进行存储,所以正则表达式匹配时在内存中根本没有1这个元素,所以造成了异常。
[code lang=”python”]
>>> re.match(r'<(abc|def)>.*</1>’,'<abc>content</def>’)
>>> re.match(r'<(abc|def)>.*</1>’,'<abc>content</abc>’)
<_sre.SRE_Match object at 0x0000000002A00288>
>>> re.match(r'<(?:abc|def)>.*</1>’,'<abc>content</def>’)

Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
re.match(r'<(?:abc|def)>.*</1>’,'<abc>content</def>’)
File "E:DevelopingPythonlibre.py", line 137, in match
return _compile(pattern, flags).match(string)
File "E:DevelopingPythonlibre.py", line 242, in _compile
raise error, v # invalid expression
error: bogus escape: ‘\1’
[/code]

 

 

python官方文档读书笔记[0] enumerate map with…open

根据之前定的计划,开始水一些小笔记,主要是为了给自己看,不是做教程,所以只选取一些以前不太了解的小知识。

代码高亮插件待配置

目前python官方文档扫了一遍Tutorial,然后开始看Standard Library built-in functions篇,有些以前不太熟但是感觉很有用的用法。

  • enumerate()函数 同时遍历元素和索引值

当我们遍历一个序列时,如果需要用到每一个元素的值时,习惯上会这么写:
[code lang=”python”]
>>> lst = [10,20,30,40]
>>> for elem in lst:

[/code]

当需要同时用到每一个iterator以及它的索引值时,就可以使用到enumerate()函数,将序列作为其参数,可以在每个iterator中产生(索引号,元素值)的元组,用法如下:
[code lang=”python”]
>>> lst = [10,20,30,40]
>>> for i, elem in enumerate(lst):

[/code]

  • map()函数用法 将一个或多个序列中的元素批量进行修改转化成新的序列B

map(func,seq1[,seq2…])

第一个参数func为一个函数对象,这个函数将运用在后续的seq1,seq2…中,map函数将会遍历计算return_value[i] = func(seq1[i],seq2[i],…) 形成一个新的序列。

通常会与lambda表达式一起使用,会使得程序代码量变得十分简洁。

举个例子吧:一个序列中全是整数,我想将这个序列的值全都乘以2
[code lang=”python”]
>>> l = [5, 10, 15, 30]
>>> map(lambda x:x*2, l)
[10, 20, 30, 60]
[/code]

  • with…open,一个资源释放方便的文件读写方式

一般在文件读写时python要使用open函数,然后进行读或写,还要记得使用close函数释放文件句柄,当大量文件句柄忘记释放,则会造成程序异常,资源耗尽的现象。

with…open实际上将一个文件的读写集中在一个try block中,并且当with…open语句结束后,文件句柄自然被释放,是一个较为安全、简洁的写法。

例子:
[code lang=”python”]
>>> with open(‘workfile’, ‘r’) as f:
… read_data = f.read()
>>> f.closed
True
[/code]