Python Standard Library
翻译: Python 江湖群
2008-03-28 13:11:55
Contents
-
1. 其他模块
- 1.1. 概览
- 1.2. pyclbr 模块
- 1.3. filecmp 模块
- 1.4. cmd 模块
- 1.5. rexec 模块
- 1.6. Bastion 模块
- 1.7. readline 模块
- 1.8. rlcompleter 模块
- 1.9. statvfs 模块
- 1.10. calendar 模块
- 1.11. sched 模块
- 1.12. statcache 模块
- 1.13. grep 模块
- 1.14. dircache 模块
- 1.15. dircmp 模块
- 1.16. cmp 模块
- 1.17. cmpcache 模块
- 1.18. util 模块
- 1.19. soundex 模块
- 1.20. timing 模块
- 1.21. posixfile 模块
- 1.22. bisect 模块
- 1.23. knee 模块
- 1.24. tzparse 模块
- 1.25. regex 模块
- 1.26. regsub 模块
- 1.27. reconvert 模块
- 1.28. regex_syntax 模块
- 1.29. find 模块
[index.html 返回首页]
1. 其他模块
1.1. 概览
本章描述的是一些并不怎么常见的模块. 一些是很实用的, 另些是已经废弃的模块.
1.2. pyclbr 模块
pyclbr 模块包含一个基本的 Python 类解析器, 如 Example 14-1 所示.
版本 1.5.2 中, 改模块只包含一个 readmodule 函数, 解析给定模块, 返回一个模块所有顶层类组成的列表.
1.2.0.1. Example 14-1. 使用 pyclbr 模块
File: pyclbr-example-1.py
import pyclbr
mod = pyclbr.readmodule("cgi")
for k, v in mod.items():
print k, v
*B*MiniFieldStorage <pyclbr.Class instance at 7873b0>
InterpFormContentDict <pyclbr.Class instance at 79bd00>
FieldStorage <pyclbr.Class instance at 790e20>
SvFormContentDict <pyclbr.Class instance at 79b5e0>
StringIO <pyclbr.Class instance at 77dd90>
FormContent <pyclbr.Class instance at 79bd60>
FormContentDict <pyclbr.Class instance at 79a9c0>*b*2.0 及以后版本中, 添加了另个接口 readmodule_ex , 它还会读取全局函数. 如 Example 14-2 所示.
1.2.0.2. Example 14-2. 使用 pyclbr 模块读取类和函数
File: pyclbr-example-3.py
import pyclbr
# 2.0 and later
mod = pyclbr.readmodule_ex("cgi")
for k, v in mod.items():
print k, v
*B*MiniFieldStorage <pyclbr.Class instance at 00905D2C>
parse_header <pyclbr.Function instance at 00905BD4>
test <pyclbr.Function instance at 00906FBC>
print_environ_usage <pyclbr.Function instance at 00907C94>
parse_multipart <pyclbr.Function instance at 00905294>
FormContentDict <pyclbr.Class instance at 008D3494>
initlog <pyclbr.Function instance at 00904AAC>
parse <pyclbr.Function instance at 00904EFC>
StringIO <pyclbr.Class instance at 00903EAC>
SvFormContentDict <pyclbr.Class instance at 00906824>
...*b*访问类实例的属性可以获得关于类的更多信息, 如 Example 14-3 所示.
1.2.0.3. Example 14-3. 使用 pyclbr 模块
File: pyclbr-example-2.py
import pyclbr
import string
mod = pyclbr.readmodule("cgi")
def dump(c):
# print class header
s = "class " + c.name
if c.super:
s = s + "(" + string.join(map(lambda v: v.name, c.super), ", ") + ")"
print s + ":"
# print method names, sorted by line number
methods = c.methods.items()
methods.sort(lambda a, b: cmp(a[1], b[1]))
for method, lineno in methods:
print " def " + method
print
for k, v in mod.items():
dump(v)
*B*class MiniFieldStorage:
def _ _init_ _
def _ _repr_ _
class InterpFormContentDict(SvFormContentDict):
def _ _getitem_ _
def values
def items
...*b*
1.3. filecmp 模块
( 2.0 新增) filecmp 模块用于比较文件和目录, 如 Example 14-4 所示.
1.3.0.1. Example 14-4. 使用 filecmp 模块
File: filecmp-example-1.py
import filecmp
if filecmp.cmp("samples/sample.au", "samples/sample.wav"):
print "files are identical"
else:
print "files differ!"
# files differ!1.5.2 以及先前版本中, 你可以使用 cmp 和 dircmp 模块代替.
1.4. cmd 模块
cmd 模块为命令行接口( command-line interfaces , CLI )提供了一个简单的框架. 它被用在 pdb 模块中, 当然你也可以在自己的程序中使用它, 如 Example 14-5 所示.
你只需要继承 Cmd 类, 定义 do 和 help 方法. 基类会自动地将这些方法转换为对应命令.
1.4.0.1. Example 14-5. 使用 cmd 模块
File: cmd-example-1.py
import cmd
import string, sys
class CLI(cmd.Cmd):
def _ _init_ _(self):
cmd.Cmd._ _init_ _(self)
self.prompt = '> '
def do_hello(self, arg):
print "hello again", arg, "!"
def help_hello(self):
print "syntax: hello [message]",
print "-- prints a hello message"
def do_quit(self, arg):
sys.exit(1)
def help_quit(self):
print "syntax: quit",
print "-- terminates the application"
# shortcuts
do_q = do_quit
#
# try it out
cli = CLI()
cli.cmdloop()
*B*> help
Documented commands (type help <topic>):
========================================
hello quit
Undocumented commands:
======================
help q
> hello world
hello again world !
> q*b*
1.5. rexec 模块
Feather 注: 版本 2.3 时取消了改模块的支持, 具体原因请参阅 : http://www.amk.ca/python/howto/rexec/ 和 http://mail.python.org/pipermail/python-dev/2002-December/031160.html
解决方法请参阅: http://mail.python.org/pipermail/python-list/2003-November/234581.html
rexec 模块提供了在限制环境下的 exec , eval , 以及 import 语句, 如 Example 14-6 所示. 在这个环境下, 所有可能对机器造成威胁的函数都不可用.
1.5.0.1. Example 14-6. 使用 rexec 模块
File: rexec-example-1.py
import rexec
r = rexec.RExec()
print r.r_eval("1+2+3")
print r.r_eval("_ _import_ _('os').remove('file')")
*B*6
Traceback (innermost last):
File "rexec-example-1.py", line 5, in ?
print r.r_eval("_ _import_ _('os').remove('file')")
File "/usr/local/lib/python1.5/rexec.py", line 257, in r_eval
return eval(code, m._ _dict_ _)
File "<string>", line 0, in ?
AttributeError: remove*b*
1.6. Bastion 模块
Feather 注: 版本 2.3 时取消了改模块的支持, 具体原因请参阅 : http://www.amk.ca/python/howto/rexec/ 和 http://mail.python.org/pipermail/python-dev/2003-January/031848.html
Bastion 模块, 允许你控制给定对象如何使用, 如 Example 14-7 所示. 你可以通过它把对象从未限制部分传递到限制部分.
默认情况下, 所有的实例变量都是隐藏的, 所有的方法以下划线开头.
1.6.0.1. Example 14-7. 使用 Bastion 模块
File: bastion-example-1.py
import Bastion
class Sample:
value = 0
def _set(self, value):
self.value = value
def setvalue(self, value):
if 10 < value <= 20:
self._set(value)
else:
raise ValueError, "illegal value"
def getvalue(self):
return self.value
#
# try it
s = Sample()
s._set(100) # cheat
print s.getvalue()
s = Bastion.Bastion(Sample())
s._set(100) # attempt to cheat
print s.getvalue()
*B*100
Traceback (innermost last):
...
AttributeError: _set*b*你可以控制发布哪个函数. 在 Example 14- 中, 内部方法可以从外部调用, 但 getvalue 不再起作用.
1.6.0.2. Example 14-8. 使用 Bastion 模块处理非标准过滤器
File: bastion-example-2.py
import Bastion
class Sample:
value = 0
def _set(self, value):
self.value = value
def setvalue(self, value):
if 10 < value <= 20:
self._set(value)
else:
raise ValueError, "illegal value"
def getvalue(self):
return self.value
#
# try it
def is_public(name):
return name[:3] != "get"
s = Bastion.Bastion(Sample(), is_public)
s._set(100) # this works
print s.getvalue() # but not this
*B*100
Traceback (innermost last):
...
AttributeError: getvalue*b*
1.7. readline 模块
(可选) readline 模块使用 GNU readline 库(或兼容库)实现了 Unix 下增强的输入编辑支持. 如 Example 14-9 所示.
该模块提供了增强的命令行编辑功能, 例如命令行历史等. 它还增强了 input 和 raw_input 函数.
1.7.0.1. Example 14-9. 使用 readline 模块
File: readline-example-1.py import readline # activate readline editing
1.8. rlcompleter 模块
(可选, 只用于 Unix ) rlcompleter 模块为 readline 模块提供了单词自动完成功能.
导入该模块就可以启动自动完成功能. 默认情况下完成函数被绑定在了 Esc 键上. 按两次 Esc 键就可以自动完成当前单词. 你可以使用下面的代码修改所绑定的键:
import readline
readline.parse_and_bind("tab: complete")Example 14-10 展示了如何在程序中使用自动完成函数.
1.8.0.1. Example 14-10. 使用 rlcompleter 模块展开名字
File: rlcompleter-example-1.py
import rlcompleter
import sys
completer = rlcompleter.Completer()
for phrase in "co", "sys.p", "is":
print phrase, "=>",
# emulate readline completion handler
try:
for index in xrange(sys.maxint):
term = completer.complete(phrase, index)
if term is None:
break
print term,
except:
pass
print
co => continue compile complex coerce completer
sys.p => sys.path sys.platform sys.prefix
is => is isinstance issubclass
1.9. statvfs 模块
statvfs 模块包含一些与 os.statvfs (可选)函数配合使用的常量和函数, 该函数会返回文件系统的相关信息. 如 Example 14-11 所示.
1.9.0.1. Example 14-11. 使用 statvfs 模块
File: statvfs-example-1.py
import statvfs
import os
st = os.statvfs(".")
print "preferred block size", "=>", st[statvfs.F_BSIZE]
print "fundamental block size", "=>", st[statvfs.F_FRSIZE]
print "total blocks", "=>", st[statvfs.F_BLOCKS]
print "total free blocks", "=>", st[statvfs.F_BFREE]
print "available blocks", "=>", st[statvfs.F_BAVAIL]
print "total file nodes", "=>", st[statvfs.F_FILES]
print "total free nodes", "=>", st[statvfs.F_FFREE]
print "available nodes", "=>", st[statvfs.F_FAVAIL]
print "max file name length", "=>", st[statvfs.F_NAMEMAX]
*B*preferred block size => 8192
fundamental block size => 1024
total blocks => 749443
total free blocks => 110442
available blocks => 35497
total file nodes => 92158
total free nodes => 68164
available nodes => 68164
max file name length => 255*b*
1.10. calendar 模块
calendar 模块是 Unix cal 命令的 Python 实现. 它可以将给定年份/月份的日历输出到标准输出设备上.
prmonth(year, month) 打印给定月份的日历, 如 Example 14-12 所示.
1.10.0.1. Example 14-12. 使用 calendar 模块
File: calendar-example-1.py
import calendar
calendar.prmonth(1999, 12)
*B* December 1999
Mo Tu We Th Fr Sa Su
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31*b*prcal(year) 打印给定年份的日历, 如 Example 14-13 所示.
1.10.0.2. Example 14-13. 使用 calendar 模块
File: calendar-example-2.py
import calendar
calendar.prcal(2000)
*B* 2000
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3 4 5
3 4 5 6 7 8 9 7 8 9 10 11 12 13 6 7 8 9 10 11 12
10 11 12 13 14 15 16 14 15 16 17 18 19 20 13 14 15 16 17 18 19
17 18 19 20 21 22 23 21 22 23 24 25 26 27 20 21 22 23 24 25 26
24 25 26 27 28 29 30 28 29 27 28 29 30 31
31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 7 1 2 3 4
3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11
10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18
17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25
24 25 26 27 28 29 30 29 30 31 26 27 28 29 30
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3
3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10
10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17
17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24
24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30
31
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 1 2 3 4 5 1 2 3
2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10
9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17
16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24
23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31
30 31*b*注意这里的日历是按照欧洲习惯打印的, 也就是说星期一是一个星期的第一天, 其他情况需要请参考模块中的几个类. (和咱们一样, 不用管了)
该模块中的其他类或函数可以帮助你输出自己需要的格式.
1.11. sched 模块
sched 模块为非线程环境提供了一个简单的计划任务模式. 如 Example 14-14 所示.
1.11.0.1. Example 14-14. 使用 sched 模块
File: sched-example-1.py
import sched
import time, sys
scheduler = sched.scheduler(time.time, time.sleep)
# add a few operations to the queue
scheduler.enter(0.5, 100, sys.stdout.write, ("one\n",))
scheduler.enter(1.0, 300, sys.stdout.write, ("three\n",))
scheduler.enter(1.0, 200, sys.stdout.write, ("two\n",))
scheduler.run()
*B*one
two
three*b*
1.12. statcache 模块
statcache 模块提供了访问文件相关信息的相关函数. 它是 os.stat 的扩展模块, 而且它会缓存收集到的信息. 如 Example 14-15 所示.
2.2 后该模块被废弃, 请使用 os.stat() 函数代替, 原因很简单, 它导致了更复杂的缓存管理, 反而降低了性能.
1.12.0.1. Example 14-15. 使用 statcache 模块
File: statcache-example-1.py
import statcache
import os, stat, time
now = time.time()
for i in range(1000):
st = os.stat("samples/sample.txt")
print "os.stat", "=>", time.time() - now
now = time.time()
for i in range(1000):
st = statcache.stat("samples/sample.txt")
print "statcache.stat", "=>", time.time() - now
print "mode", "=>", oct(stat.S_IMODE(st[stat.ST_MODE]))
print "size", "=>", st[stat.ST_SIZE]
print "last modified", "=>", time.ctime(st[stat.ST_MTIME])
*B*os.stat => 0.371000051498
statcache.stat => 0.0199999809265
mode => 0666
size => 305
last modified => Sun Oct 10 18:39:37 1999*b*
1.13. grep 模块
grep 模块提供了在文本文件中搜索字符串的另种方法, 如 Example 14-16 所示.
版本 2.1 时被声明不支持, 及就是说, 当前版本已经无法使用该模块.
1.13.0.1. Example 14-16. 使用 grep 模块
File: grep-example-1.py
import grep
import glob
grep.grep("\<rather\>", glob.glob("samples/*.txt"))
# 4: indentation, rather than delimiters, might become
1.14. dircache 模块
(已经废弃) 与 statcache 类似, 该模块是 os.listdir 函数的一个扩展, 提供了缓存支持, 可能因为同样的原因被废弃吧~ MUHAHAHAHAHA~~~~ . 请使用 os.listdir 代替. 如 Example 14-17 所示.
1.14.0.1. Example 14-17. 使用 dircache 模块
File: dircache-example-1.py
import dircache
import os, time
#
# test cached version
t0 = time.clock()
for i in range(100):
dircache.listdir(os.sep)
print "cached", time.clock() - t0
#
# test standard version
t0 = time.clock()
for i in range(100):
os.listdir(os.sep)
print "standard", time.clock() - t0
*B*cached 0.0664509964968
standard 0.5560845807*b*
1.15. dircmp 模块
(已废弃, 只用于 1.5.2) dircmp 模块用于比较两个目录的内容, 如 Example 14-18 所示.
1.15.0.1. Example 14-18. 使用 dircmp 模块
File: dircmp-example-1.py
import dircmp
d = dircmp.dircmp()
d.new("samples", "oldsamples")
d.run()
d.report()
*B*diff samples oldsamples
Only in samples : ['sample.aiff', 'sample.au', 'sample.wav']
Identical files : ['sample.gif', 'sample.gz', 'sample.jpg', ...]*b*Python 2.0 后, 该模块被 filecmp 替换.
1.16. cmp 模块
(已废弃, 只用于 1.5.2) cmp 模块用于比较两个文件, 如 Example 14-19 所示.
1.16.0.1. Example 14-19. 使用 cmp 模块
File: cmp-example-1.py
import cmp
if cmp.cmp("samples/sample.au", "samples/sample.wav"):
print "files are identical"
else:
print "files differ!"
*B*files differ!*b*Python 2.0 后, 该模块被 filecmp 替换.
1.17. cmpcache 模块
(已废弃, 只用于 1.5.2) cmpcache 模块用于比较两个文件. 它是 cmp 模块的扩展, 提供了缓存支持. 如 Example 14-20 所示.
1.17.0.1. Example 14-20. 使用 cmpcache 模块
File: cmpcache-example-1.py
import cmpcache
if cmpcache.cmp("samples/sample.au", "samples/sample.wav"):
print "files are identical"
else:
print "files differ!"
*B*files differ!*b*Python 2.0 后, 该模块被 filecmp 替换.
但 filecmp 已经不提供缓存支持.
1.18. util 模块
(已废弃, 只用于 1.5.2) util 模块提供了常见操作的封装函数. 新代码可以使用如 Examples 14-21 到 14-23 的实现方法.
Example 14-21 展示了 remove(sequence, item) 函数.
1.18.0.1. Example 14-21. 实现 util 模块的 remove 函数
File: util-example-1.py
def remove(sequence, item):
if item in sequence:
sequence.remove(item)Example 14-22 展示了 readfile(filename) => string 函数.
1.18.0.2. Example 14-22. 实现 util 模块的 readfile 函数
File: util-example-2.py
def readfile(filename):
file = open(filename, "r")
return file.read()Example 14-23 展示了 `readopenfile(file) => string 函数.
1.18.0.3. Example 14-23. 实现 util 模块的 readopenfile 函数
File: util-example-3.py
def readopenfile(file):
return file.read()
1.19. soundex 模块
(已废弃, 只用于 1.5.2) soundex 实现了一个简单的 hash 算法, 基于英文发音将单词转换为 6 个字符的字符串.
版本 2.0 后, 该模块已从标准库中删除.
get_soundex(word) 返回给定单词的 soundex 字符串. sound_similar(word1, word2) 判断两个单词的 soundex 是否相同. 一般说来发音相似的单词有相同的 soundex . 如 Example 14-24 所示.
1.19.0.1. Example 14-24. 使用 soundex 模块
File: soundex-example-1.py import soundex a = "fredrik" b = "friedrich" print soundex.get_soundex(a), soundex.get_soundex(b) print soundex.sound_similar(a, b) *B*F63620 F63620 1*b*
1.20. timing 模块
(已废弃, 只用于 Unix ) timing 用于监控 Python 程序的执行时间. 如 Example 14-25 所示.
1.20.0.1. Example 14-25. 使用 timing 模块
File: timing-example-1.py
import timing
import time
def procedure():
time.sleep(1.234)
timing.start()
procedure()
timing.finish()
print "seconds:", timing.seconds()
print "milliseconds:", timing.milli()
print "microseconds:", timing.micro()
*B*seconds: 1
milliseconds: 1239
microseconds: 1239999*b*你可以按照 Example 14-26 中的方法用 time 模块实现 timing 模块的功能.
1.20.0.2. Example 14-26. 模拟 timing 模块
File: timing-example-2.py
import time
t0 = t1 = 0
def start():
global t0
t0 = time.time()
def finish():
global t1
t1 = time.time()
def seconds():
return int(t1 - t0)
def milli():
return int((t1 - t0) * 1000)
def micro():
return int((t1 - t0) * 1000000)time.clock() 可以替换 time.time() 获得 CPU 时间.
1.21. posixfile 模块
(已废弃, 只用于 Unix ) posixfile 提供了一个类文件的对象( file-like object ), 实现了文件锁定的支持. 如 Example 14-27 所示. 新程序请使用 fcntl 模块代替.
1.21.0.1. Example 14-27. 使用 posixfile 模块
File: posixfile-example-1.py
import posixfile
import string
filename = "counter.txt"
try:
# open for update
file = posixfile.open(filename, "r+")
counter = int(file.read(6)) + 1
except IOError:
# create it
file = posixfile.open(filename, "w")
counter = 0
file.lock("w|", 6)
file.seek(0) # rewind
file.write("%06d" % counter)
file.close() # releases lock
1.22. bisect 模块
bisect 模块用于向排序后的序列插入对象.
insort(sequence, item) 将条目插入到序列中, 并且保证序列的排序. 序列可以是任意实现了 _ _getitem_ _ 和 insert 方法的序列对象. 如 Example 14-28 所示.
1.22.0.1. Example 14-28. 使用 bisect 模块向列表插入条目
File: bisect-example-1.py import bisect list = [10, 20, 30] bisect.insort(list, 25) bisect.insort(list, 15) print list *B*[10, 15, 20, 25, 30]*b*
bisect(sequence, item) => index 返回条目插入后的索引值, 不对序列做任何修改. 如 Example 14-29 所示.
1.22.0.2. Example 14-29. 使用 bisect 模块获得插入点位置
File: bisect-example-2.py import bisect list = [10, 20, 30] print list print bisect.bisect(list, 25) print bisect.bisect(list, 15) *B*[10, 20, 30] 2 1*b*
1.23. knee 模块
knee 模块用于 Python 1.5 中导入包( package import )的实现. 当然 Python 解释器已经支持了这个, 所以这个模块几乎没有什么作用, 不过你可以看看它的代码, 明白这一切是怎么完成的.
代码请参见 Python-X.tgz\Python-2.4.4\Demo\imputil\knee.py
当然, 你可以导入该模块,如 Example 14-30 所示.
1.23.0.1. Example 14-30. 使用 knee 模块
File: knee-example-1.py import knee # that's all, folks!
1.24. tzparse 模块
(已废弃) tzparse 模块用于解析时区标志( time zone specification ). 导入时它会自动分析 TZ 环境变量. 如 Example 14-31 所示.
1.24.0.1. Example 14-31. 使用 tzparse 模块
File: tzparse-example-1.py
import os
if not os.environ.has_key("TZ"):
# set it to something...
os.environ["TZ"] = "EST+5EDT;100/2,300/2"
# importing this module will parse the TZ variable
import tzparse
print "tzparams", "=>", tzparse.tzparams
print "timezone", "=>", tzparse.timezone
print "altzone", "=>", tzparse.altzone
print "daylight", "=>", tzparse.daylight
print "tzname", "=>", tzparse.tzname
*B*tzparams => ('EST', 5, 'EDT', 100, 2, 300, 2)
timezone => 18000
altzone => 14400
daylight => 1
tzname => ('EST', 'EDT')*b*除了这些变量之外, 该模块还提供了一些用于时间计算的函数.
1.25. regex 模块
(已废弃) regex 模块是旧版本的(1.5 前)正则表达式模块, 用法如 Example 14-32 所示. 新代码请使用 re 模块实现.
注意在 Python 1.5.2 中 regex 比 re 模块要快. 但在新版本中 re 模块更快.
1.25.0.1. Example 14-32. 使用 regex 模块
File: regex-example-1.py
import regex
text = "Man's crisis of identity in the latter half of the 20th century"
p = regex.compile("latter") # literal
print p.match(text)
print p.search(text), repr(p.group(0))
p = regex.compile("[0-9]+") # number
print p.search(text), repr(p.group(0))
p = regex.compile("\<\w\w\>") # two-letter word
print p.search(text), repr(p.group(0))
p = regex.compile("\w+$") # word at the end
print p.search(text), repr(p.group(0))
*B*-1
32 'latter'
51 '20'
13 'of'
56 'century'*b*
1.26. regsub 模块
(已废弃) regsub 模块提供了基于正则表达式的字符串替换操作. 用法如 Example 14-33 所示. 新代码请使用 re 模块中的 replace 函数代替.
1.26.0.1. Example 14-33. 使用 regsub 模块
File: regsub-example-1.py
import regsub
text = "Well, there's spam, egg, sausage, and spam."
print regsub.sub("spam", "ham", text) # just the first
print regsub.gsub("spam", "bacon", text) # all of them
*B*Well, there's ham, egg, sausage, and spam.
Well, there's bacon, egg, sausage, and bacon.*b*
1.27. reconvert 模块
(已废弃) reconvert 提供了旧样式正则表达式( regex 模块中使用)到新样式( re 模块)的转换工具. 如 Example 14-34 所示. 它也可以作为一个命令行工具.
1.27.0.1. Example 14-34. 使用 reconvert 模块
File: reconvert-example-1.py
import reconvert
for pattern in "abcd", "a\(b*c\)d", "\<\w+\>":
print pattern, "=>", reconvert.convert(pattern)
*B*abcd => abcd
a\(b*c\)d => a(b*c)d
\<\w+\> => \b\w+\b*b*
1.28. regex_syntax 模块
(已废弃) regex_syntax 模块用于改变正则表达式的模式, 如 Example 14-35 所示.
1.28.0.1. Example 14-35. 使用 regex_syntax 模块
File: regex-syntax-example-1.py
import regex_syntax
import regex
def compile(pattern, syntax):
syntax = regex.set_syntax(syntax)
try:
pattern = regex.compile(pattern)
finally:
# restore original syntax
regex.set_syntax(syntax)
return pattern
def compile_awk(pattern):
return compile(pattern, regex_syntax.RE_SYNTAX_AWK)
def compile_grep(pattern):
return compile(pattern, regex_syntax.RE_SYNTAX_GREP)
def compile_emacs(pattern):
return compile(pattern, regex_syntax.RE_SYNTAX_EMACS)
1.29. find 模块
(已废弃, 只用于 1.5.2) find 模块用于在给定目录及其子目录中查找符合给定匹配模式的文件, 如 Example 14-36 所示.
匹配模式的语法与 fnmatch 中相同.
1.29.0.1. Example 14-36. 使用 find 模块
File: find-example-1.py
import find
# find all JPEG files in or beneath the current directory
for file in find.find("*.jpg", "."):
print file
*B*.\samples\sample.jpg*b*