大多数人终生追逐的那些希望和努力是毫无价值的。每个人只是因为有个胃,就注定要参与这种追逐。而且由于参与这种追逐,他的胃是可能得到满足的,但是,一个有思想、有感情的人却不能由此得到满足。——爱因斯坦

Python 正则表达式

用perl的正则表达式习惯了,简单直接,非常方便,但转向python后,发现竟然和perl的方式不一样,感觉有点不适应,不过仔细阅读了关于python的正则表达式后,发现(re模块)其实也和perl差不多,只是表现形式不一样。

这里记录的是直接了当的案例和少许解释,只是为方便查阅。

使用raw字符串

元字符:. ^ $ * + ? { [ ] \ | ( )

如果要匹配的正式元字符,就需要使用反斜杠\,但这样有时会让程序显得很难看懂。

raw字符串就是为了解决这个问题:在字符串前加个 "r" 反斜杠,这就相当于perl中的单引号,让字符串不被任何特殊方式处理。

比如:r"\n" 就是包含"\" 和 "n" 的两个字符,而 "\n" 则是一个字符,表示一个换行。

常规字符串 Raw 字符串
"ab*" r"ab*"
"\\\\section" r"\\section"
"\\w+\\s+\\1" r"\w+\s+\1"

编译正则表达式

正则表达式被编译成 `RegexObject` 实例,可以为不同的操作提供方法,如模式匹配搜索或字符串替换。

>>> import re
>>> pattern = '^M?M?M?$'
>>> re.search(pattern, 'M')

>>> compiledPattern = re.compile(pattern)

>>> dir(compiledPattern)
['findall', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
>>> compiledPattern.search('M') 

用 'M' 作参数来调用已编译的 pattern 对象的 search 函数与用正则表达式和字符串 'M' 调用 re.search 可以得到相同的结果,只是快了很多。 (事实上,re.search 函数仅仅将正则表达式编译,然后为你调用编译后的 pattern 对象的 search 方法。)
  在需要多次使用同一个正则表达式的情况下,应该将它进行编译以获得一个 pattern 对象,然后直接调用这个 pattern 对象的方法。

也可以采用一些参数,实现不同的特殊功能和语法变更。比如经常使用的忽略大小写:
p = re.compile('ab*', re.IGNORECASE)

匹配

re.match()

决定 RE 是否在字符串刚开始的位置匹配.

re.search()

扫描字符串,找到这个 RE 匹配的位置.

>>> re.match("c", "abcdef")  # No match
>>> re.search("c", "abcdef") # Match
<_sre.SRE_Match object at ...>

search()中,也可以使用“^”来匹配字符串开头,就像Perl中一样。

>>> re.match("c", "abcdef")  # No match
>>> re.search("^c", "abcdef") # No match
>>> re.search("^a", "abcdef")  # Match
<_sre.SRE_Match object at ...>

Note however that in MULTILINE mode match() only matches at the beginning of the string, whereas using search() with a regular expression beginning with '^' will match at the beginning of each line.

>>> re.match('X', 'A\nB\nX', re.MULTILINE)  # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE)  # Match
<_sre.SRE_Match object at ...>

findall()
找到 RE 匹配的所有子串,并把它们作为一个列表返回
finditer()
找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

参考文档:
1. http://wiki.ubuntu.com.cn/Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97
2. http://woodpecker.org.cn/diveintopython/refactoring/refactoring.html

posted @ 2013-05-19 22:34  东去春来  阅读(349)  评论(0编辑  收藏  举报