Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29956853
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2010-02-08 16:42:08

python正则表达式专题

一、整理其应用于python的用到的正则表达式

1.1   字符匹配

元字符列表:

. ^ $ * + ? { [ ] \ | ( )

字符可以单个列出,也可以用“-”号分隔的两个给定字符来表示一个字符区间。例如,[abc] 将匹配"a", "b", "c"中的任意一个字符;也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写字母。那么 RE 应写成 [a-z].

你可以用补集来匹配不在区间范围内的字符。其做法是把"^"作为类别的首个字符;其它地方的"^"只会简单匹配 "^"字符本身。例如,[^5] 将匹配除 "5" 之外的任意字符。

也许最重要的元字符是反斜杠"\" 做为 Python 中的字符串字母,反斜杠后面可以加不同的字符以表示不同特殊意义。它也可以用于取消所有的元字符,这样你就可以在模式中匹配它们了。举个例子,如果你需要 匹配字符 "[" "\",你可以在它们之前用反斜杠来取消它们的特殊意义: \[ \\

PS:其中的\ 表示转义处理

常用的字符:

\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_]

这两种写法是等价的!

1.2   重复

第一个重复功能的元字符是 ** 并不匹配字母字符 "*";相反,它指定前一个字符可以被匹配零次或更多次,而不是只有一次。

另一个重复元字符是 +,表示匹配一或更多次。请注意 * + 之间的不同;* 匹配零或更多次,所以根本就可以不出现,而 + 则要求至少出现一次。

问号 ? 匹配一次或零次;

最复杂的重复限定符是 {m,n},其中 m n 是十进制整数。该限定符的意思是至少有 m 个重复,至多到 n 个重复。

你可以忽略 m n;因为会为缺失的值假设一个合理的值。忽略 m 会认为下边界是 0,而忽略 n 的结果将是上边界为无穷大 -- 实际上是先前我们提到的 2 兆,但这也许同无穷大一样。

PS:包括* ? + {m,n}  这样的重复标识

 

了解了常用的正则表达式之后就可以将其融入到python里面了。因为我发现不同的语言在正则上面还是有点差异的。故此我先将其能用到的正则内容整理完。

 

二、python中应用正则

使用正则对象

import re

p = re.compile('^[1-9]\d*$',re.S)

得到一个RegexObject对象。可以用它来做的事情如下:

 

方法/属性

作用

match()

决定 RE 是否在字符串刚开始的位置匹配

search()

扫描字符串,找到这个 RE 匹配的位置

findall()

找到 RE 匹配的所有子串,并把它们作为一个列表返回

finditer()

找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

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

PS:所以可以这样写

#-*- coding: utf-8 -*-

import re

p = re.compile('^[1-9]\d*$',re.S)

if p.match("sd"):               如果存在则不会返回None值对象

    print "is ok"

else:

print "not "

如果返回了一个MatchObject对象之后就可以使用其方法进行相关操作

现在你可以查询 `MatchObject` 关于匹配字符串的相关信息了。MatchObject 实例也有几个方法和属性;最重要的那些如下所示:

方法/属性

作用

group()

返回被 RE 匹配的字符串

start()

返回匹配开始的位置

end()

返回匹配结束的位置

span()

返回一个元组包含匹配 (开始,结束) 的位置


试试这些方法不久就会清楚它们的作用了:

一般的代码:

#-*- coding: utf-8 -*-

import re

p = re.compile('^[1-9]\d*$',re.S)

if p.match("23"):                   #如果此匹配返回的不是None之后就可以继续调用它方法

    print p.match("23").group(0)    #调用其

    print "is ok"

else:

    print "not"

 

 

 

一般的写法:

#!python
p = re.compile( ... )
m = p.match( 'string goes here' )
if m:                                      #如果返回不为None则可以继续
print 'Match found: ', m.group()
else:
print 'No match'

 

2.2 编译标志

这有个可用标志表,对每个标志后面都有详细的说明。

标志

含义

DOTALL, S

使 . 匹配包括换行在内的所有字符

IGNORECASE, I

使匹配对大小写不敏感

LOCALE, L

做本地化识别(locale-aware)匹配

MULTILINE, M

多行匹配,影响 ^ $

VERBOSE, X

能够使用 REs verbose 状态,使之被组织得更清晰易懂

 

 

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

chinaunix网友2010-03-31 18:04:47

晚上专题再整理一下还有文件目录操作专题。遍历的 数据库安装方面的专题