正则表达式基本语法
常用正则表达式符号
符号 | 说明 | 举例 |
---|
literal | 匹配字符串的值 | Foo |
re1|re2 | 匹配正则表达式re1或re2 | foo |
. | 匹配任何字符(换行符除外) | b.b |
^ | 匹配字符串的开始 | ^bear |
$ | 匹配字符串的结尾 | /bin/*sh$ |
* | 匹配前面出现的正则表达式零次或是多次([0, +∞)) | [A-Za-z0-9]* |
+ | 匹配前面出现的正则表达式一次或是多次([1, +∞)) | [a-z]+.com |
? | 匹配前面出现的正则表达式零次或是一次(0, 1) | Goo? |
{N} | 匹配前面出现的正则表达式N次 | [0-9]{3} |
{M, N} | 匹配重复出现M次到N次的正则表达式 | [0-9]{5, 9} |
[…] | 匹配字符组里面出现的任意一个字符 | [aeiou] |
[..x-y..] | 匹配从字符x到y中的任意一个字符 | [0-9], [A-Za-z] |
[^…] | 不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) | [^aeiou], [^A-Za-z0-9] |
(*|+|?|{})? | 英语上面出现的任何“非贪婪”版本重复匹配次数符号(*,+,?,{}) | .*?[a-z] |
(…) | 匹配封闭括号中正则表达式(RE),保存为子组 | ([0-9]{3})?, f(oo |
特殊符号
符号 | 说明 | 举例 |
---|
\d | 匹配任何数字,和[0-9]一样(\D是\d的反义:任何非数字字符) | Data\d+.txt |
\w | 匹配任何数字字母字符,和[a-zA-Z0-9]相同(\W是\w的反义) | [A-Z][a-z]\w+ |
\s | 匹配任何空白符,和[\n\t\r\v\f]相同,(\S是\s的反义) | Of\sthe |
\b | 匹配单词边界(\B是\b的反义) | \bThe\b |
\nn | 匹配已保存的子组(可以参考正则表达式:(…)) | Price:\16 |
\c | 逐一匹配特殊字符c(即,取消它的特殊含义,按照字面匹配) | ., \, * |
\A (\Z) | 匹配字符串的起始(结束) | \ADear |
正则表达式在Python下的使用
Python下常用的正则表达式函数
函数/方法 | 描述 |
---|
re模块的函数compile(pattern,flags=0) | 对正则表达式模式pattern进行编译,flags是可选标志符,并返回一个regex对象 |
re模块的函数和regex对象的方法match(pattern, string, flags=0) | 尝试用正则表达式模式pattern匹配字符串string,flags是可选标志符,如果匹配成功,则返回一个匹配对象;否则返回None |
search(pattern, string, flags=0) | 在字符串string中查找正则表达式模式pattern的第一次出现,flags是可选标志符,如果匹配成功,则返回一个匹配对象;否则返回None |
Python中compile函数
compile函数主要是为了来提升性能的,那么RE 编译(何时应该使用compile函数?),下面是具体的原因:
Python 的代码最终会被编译为字节码,然后才被解释器执行。Python中的eval()或exec()调用一个代码对象而不是一个字符串,在性能上会有明显地提升,这是因为 编译过程不必执行。换句话说,使用预编译代码对象要比使用字符串快,因为解释器在执行字符串形式的代码前必须先把它编译成代码对象。
这个概念也适用于正则表达式, 在模式匹配之前, 正则表达式模式必须先被编译成 regex 对象。由于正则表达式在执行过程中被多次用于比较,我们强烈建议先对它做预编译,而且,既然正则表达式的编译是必须的,那使用么预先编译来提升执行性能无疑是明智之举。re.compile() 就是用来提供此功能的。
其实模块函数会对已编译对象进行缓存,所以不是所有使用相同正则表达式模式的 search()和match()都需要编译。即使这样,你仍然节省了查询缓存,和用相同的字符串反复调用函数的性能开销。 在 Python1.5.2 版本里, 缓存区可以容纳 20 个已编译的正则表达式对象,而在 1.6 版本里,由于另外添加了对 Unicode 的支持,编译引擎的速度变慢了一些,所以缓存区被扩展到可以容纳 100个已编译的 regex 对象。