首页 > 深入Python > HTML 处理 > 正则表达式 101 | << >> | ||||
diveintopython.org Python for experienced programmers |
正则表达式是一种强大的(并且非常标准化的)方法,通过使用复杂的字符模式,可以对文本进行搜索、替换和分解。如果你曾经在其它的语言中(象Perl)使用过正则表达式,应该可以跳过本节,只要读一下关于 re 模块 的小结,对可用的函数和它们的参数有个大概的了解就行了。
字符串拥有一些方法,可以进行搜索(index,find,和 count),替换(replace),和分解(split),但它们只限于一些最简单的情况。搜索方法可以查找单个,固定编码的子串,并且它们总是大小写敏感的;为了对一个字符串 s 执行大小写不敏感搜索,你必须调用 s.lower() 或 s.upper() ,并确保要搜索的字符串有着相匹配的大小写。replace 和 split 方法也有着同样的限制。如果可能,你应该使用它们(它们的执行速度快并易于阅读),但对于更复杂的情况,你不得不转移到正则表达式上来。
这些例子是受到在我每天的工作中所遇到的现实问题的启发而写出来的。我需要从一个老系统中导出街道的地址,在将它们导入到一个新系统之前,进行清理和标准化处理。(瞧,我不只是拼凑出这个东西,它实际上有用。)
>>> s = '100 NORTH MAIN ROAD' >>> s.replace('ROAD', 'RD.') '100 NORTH MAIN RD.' >>> s = '100 NORTH BROAD ROAD' >>> s.replace('ROAD', 'RD.') '100 NORTH BRD. RD.' >>> s[:-4] + s[-4:].replace('ROAD', 'RD.') '100 NORTH BROAD RD.' >>> import re >>> re.sub('ROAD$', 'RD.', s) '100 NORTH BROAD RD.'
>>> s = '100 BROAD' >>> re.sub('ROAD$', 'RD.', s) '100 BRD.' >>> re.sub('\\bROAD$', 'RD.', s) '100 BROAD' >>> re.sub(r'\bROAD$', 'RD.', s) '100 BROAD' >>> s = '100 BROAD ROAD APT. 3' >>> re.sub(r'\bROAD$', 'RD.', s) '100 BROAD ROAD APT. 3' >>> re.sub(r'\bROAD\b', 'RD.', s) '100 BROAD RD. APT 3'
这只是正则表达式能够实现功能的冰山之一角。它们相当强大,有专门讲述它们的整本书。它们不是解决所有问题的正确方法。你应该充分地学习它们,了解何时使用它们是合适的,何时比起要解决的问题来说,它们将只会引起更多的麻烦。
有一些人,当遇到了一个问题,会想“我懂,我将使用正则表达式。”现在他们有了两个问题。 |
||
--Jamie Zawinski,在 comp.lang.emacs |
进一步阅读
dialect.py 介绍 |
1 2 3 4 5 6 7 8 9 10 11 |
全部放在一起 |