全部博文(2065)
分类: 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 状态,使之被组织得更清晰易懂 |