您的位置:首页 > 编程语言 > Python开发

正则表达式的基本语法和在Python下的使用

2017-05-10 10:14 627 查看

正则表达式基本语法

常用正则表达式符号

符号说明举例
literal匹配字符串的值Foo
re1|re2匹配正则表达式re1或re2foo
.匹配任何字符(换行符除外)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 对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: