Python中的正则表达式
《Python核心编程》 by Wesley J. Chun
Chapter 15 正则表达式
推荐读物《精通正则表达式》(Mastering Regular Expressions) by Jeffrey E. F. Friedl
Python通过标准库的re模块支持正则表达式Regulation Expression
Search:在字符串任意部分中搜索匹配的模式
Match:判断一个字符串能否从起始处全部或部分的匹配某个模式
正则表达式匹配的是字符串的集合而不只是一个字符串,否则就没有意义了。
常用的原字符(metacharacter)
特殊字符
记号
说明
样例
\d
匹配任何数字,和[0-9]一样(\D:任何非数符字)
data\d+.txt
\w
匹配任何数字字母字符,和[A-Za-z0-9_]相同 \W是反义
[A-Za-z0-9_]\w+
\s
匹配任何空白字符,和[\n\t\r\v\f]相同,\S是反义
Of\sthe
\b
匹配单词边界 \B是反义
\bThe\b
\nn
匹配已保存的子组
Price:\16
\c
逐一匹配特殊字符c(即取消它的特殊含义,按字面匹配)
\.,\\,\*
\A(\Z)
匹配字符串的起始(结束)和^$作用一样
\ADear
举例
.. 匹配任意两个字符 .end 匹配在end前的任意一个字符
^即caret,脱字符号 ^from 匹配任何以from开始的字符串 同理有$
\b匹配一个单词边界,与之对应的模式一定在一个单词的开头,不论这个单词前面是有字符还是没有字符。\B 只匹配出现在一个单词中间的模式(即,不在单词边界上的字符)
The 任何包含有“The”的字符串
\bThe 任何以The开始的字符串
\bThe\b 仅匹配单词The
\Bthe 任意包含the但不以the开头的单词
*匹配它左边那个正则表达式出现0次或0次以上的情况(在编译原理里,此操作符被叫做Kleene闭包操作符)
+匹配它左边那个正则表达式出现1次或1次以上的情况(此操作符被叫做正闭包操作符)
?匹配它左边那个正则表达式出现0次或1次以上的情况
{N}匹配N次出现;{M,N}匹配M次到N次出现
当使用了表示重复的原字符(*+?{m,n})时,正则表达式会在匹配模式时,尽量吸收更多的字符。问号告诉正则表达式引擎尽可能的偷懒,要求当前匹配消耗的字符越少越好,留下尽可能多的字符给后面的模式。
[dn]ot? 匹配do no dot not
0?[1-9] 1-9中的任意一个数字,前面可能有一个0
[0-9]{15,16} 15或16位的数字,如信用卡号码
</?[^>]+> 匹配所有合法(和无效的)HTML标签的字符串
[KQRBNP][a-h][1-8]-[a-h][1-8] 在“长代数”记普法中,表示国际象棋合法的棋盘移动
\w+-\d+ 一个由字母或数字组成的字符串和至少一个数字,两部分用-连接
\d{d}-\d{3}-\d{4} 匹配一个电话号码如800-555-1212
\w+@\w+\.com 匹配xxx@xxx.com
要想匹配xx@host.yyy.com就要修改为\w+@(\w+\.)?\w+\.com其中(\w+\.)?表示主机名host部分是可选出现的。如果?改为*则表示允许有0个或多个主机名在域名yyy.com之前
() 在匹配成功时取出某个特定的字符串或子字符串。可以对正则表达式进行分组,还可以用来匹配子组。例如“\w+-\d+”匹配了一些内容,此时想把第一部分的字符和第二部分的数字分别保存,就可以用(\w+)-(\d+),然后对这两个匹配的子组分别进行访问了。用group(1),group(2)…
\d+(\.\d*)? 表示简单的浮点型数字。后面跟一个可选的小数点然后再接0个或多个十进制数字0.04或4
#! /usr/bin/env python
#coding=utf-8
import re
data='Thu Oct 22 21:13:23 1998::gjivgb@axplhnbsqtkq.com::909062003-6-12'
patt = '.+?(\d+-\d+-\d+)' #.#用来匹配前面的任意多个字符,()用来获取我们需要的那部分数据
print re.match(patt,data).group(1) #
patt2 = '-(\d+)-'
m = re.search(patt2, data)
print m.group() #-6-
print m.group(1) #6 取得子组
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。