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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m_buddy/article/details/71514871

正则表达式基本语法

常用正则表达式符号

符号 说明 举例
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 对象。

阅读更多

扫码向博主提问

m_buddy

若需更多解答,请您扫码@_@…
  • 擅长领域:
  • 机器瞎学
去开通我的Chat快问
换一批

没有更多推荐了,返回首页