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