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注册。

posted @ 2010-11-18 17:44  莫忆往西  阅读(287)  评论(0编辑  收藏  举报