Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1381387
  • 博文数量: 247
  • 博客积分: 10147
  • 博客等级: 上将
  • 技术积分: 2776
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-24 15:18
文章分类

全部博文(247)

文章存档

2013年(11)

2012年(3)

2011年(20)

2010年(35)

2009年(91)

2008年(87)

我的朋友

分类: Python/Ruby

2009-03-16 10:04:13

python中的re模块实现了正则表达式的功能。

  首先产生正则表达式模式,然后python将其转化为字节码,通过c语言的匹配引擎进行配操作,匹配的基本原理类似于先深搜索。

  正则表达式的元字符有. ^ $ * + ? { [ ] \ | ( )

.表示任意字符

[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系。

^ 如果放在字符串的开头,则表示取非的意思。[^5]表示除了5之外的其他字符。而如果^不在字符串的开头,则表示它本身。

具有重复功能的元字符:

* 对于前一个字符重复0到无穷次

+ 对于前一个字符重复1到无穷次

?对于前一个字符重复0到1次

{m,n} 对于前一个字符重复次数在为m到n次,其中,{0,} = *,{1,} = +, {0,1} = ?

{m} 对于前一个字符重复m次

\

\d 匹配任何十进制数;它相当于类 [0-9]。

\D 匹配任何非数字字符;它相当于类 [^0-9]。

\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。

\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。

\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。

\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。

使用表达式

现在我们已经看了一些简单的表达式,那么我们实际在 中是如何使用它们的呢? re 模块提供了一个表达式引擎的接口,可以让你将 REs 编译成对象并用它们来进行匹配。

编译表达式

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

#!

>>> import re

>>> p = re.compile('ab*')

>>> print p

<re.RegexObject instance at 80b4150>

re.compile() 也接受可选的标志参数,常用来实现不同的特殊功能和语法变更。我们稍後将查看所有可用的设置,但现在只举一个例子:

#!

>>> p = re.compile('ab*', re.IGNORECASE)

RE 被做为一个字符串发送给 re.compile()。REs 被处理成字符串是因为表达式不是 语言的核心部分,也没有为它创建特定的语法。(应用程序根本就不需要 REs,因此没必要包含它们去使语言说明变得臃肿不堪。)而 re 模块则只是以一个 C 扩展模块的形式来被 包含,就象 socket 或 zlib 模块一样。

执行匹配

一旦你有了已经编译了的表达式的对象,你要用它做什么呢?`RegexObject` 实例有一些方法和属性。这里只显示了最重要的几个,如果要看完整的列表请查阅 Library Reference

方法/属性 作用
match() 决定 RE 是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个 RE 匹配的位置
findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回
finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回


如果没有匹配到的话,match() 和 search() 将返回 None。如果成功的话,就会返回一个 `MatchObject` 实例,其中有这次匹配的信息:它是从哪里开始和结束,它所匹配的子串等等。

 

----------------------------------------------------------------

好文章:正则表达式30分钟入门教程

 

阅读(4842) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~