python 正则

可以下载一个正则表达式工具Match Tracer

常见的元字符

.        匹配除换行符以外的任意字符

\b      匹配单词的开始或结束

\d      匹配数字

\w     匹配字母、数字、下划线或汉子

\s     匹配任意空白符,  包括空格、制表符、换行符、中文全角空格等

^      匹配字符串的开始

$      匹配字符串的结束

假如一行文本为:we are still studying and so busy,我们想匹配出所有以s开头的单词,那么正则表达式可以写为\bs\w*\b

重复 列举出匹配重复的限定符

*            重复零次或更多次

+           重复一次或更多次

?           重复零次或一次

{n}        重复n次

{n,}       重复n次或更多次

{n,m}    重复n到m次

 

字符集合

正则表达式是通过[]来实现自定义字符集合,[abcde]就是匹配abcde中的任意一个字符,除了将需要自定义的字符都写入[]中,还可以指定一个字符范围。[0-9]代表的含义与\d是完全一致的

代表一位数字[a-z0-9A-Z_]也完全等同于\w代表着26个字母中的大小写,0-9的数字和下划线中的任一个字符

分支条件

正则表达式里的分支条件指的是有几种匹配规则,如果满足其中任意一种规则都应该当成匹配,具体用法是用“|”把不同的规则分隔开,例如匹配电话号码,电话号码中一种是3位区号,8位本地号010-11223344,另一种是4位区号,7位本地号如0321-1234567

如果想把电话号码匹配出来,就需要用到分支条件:0\d{2}-\d{8}|0\d{3}-\d{7}.在分支条件中有一点需要注意,匹配分支条件时,将会从左到右地测试每个条件,如果满足了某个分支的话,就不会去管其他条件了,条件之间是一种或的关系

反义
有时需要查找除某一类字符集合之外的字符。比如想查找除了数字以外,包含其他任意字符的情况,这时就需要用到反义

\W   匹配任意不是字母、数字、下划线、汉字的字符

\S   匹配任意不是空白符的字符

\D  匹配任意非数字的字符

\B  匹配不是单词开头或结束的位置

[^a]  匹配除了a以外的任意字符

[^abcde]  匹配除了a,b,c,d,e这几个字母以外的任意字符

贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能多的字符,这就是贪婪模式

*?    重复任意次,但尽可能少重复

+?   重复一次或更多次,但尽可能少重复

??  重复0次或一次但尽可能少重复

{n,m}?   重复n到m次,但尽可能少重复

{n,}?     重复n次以上但尽可能少重复

 

re.match(pattern,strings[,flags])

这个函数是从输入参数string的开头开始,尝试匹配pattern,一直向后匹配,如果遇到无法匹配的字符或者已经到达string的末尾,立即返回None,反之获取匹配的结果

 

#coding:utf-8

import re
#将正则表达式编译成pattern对象
pattern = re.compile(r'\d+')

result1 = re.match(pattern,'192abc')

if result1 :

print result1.group()

else:

print u'匹配失败1'


result2 =re.match(pattern,'abc192')

if result2 :

print result2.group()

else:

print u'匹配失败2'

运行结果如下:

匹配192abc字符串时,match函数是从字符串开头进行匹配,匹配到192立即返回值,通过group()可以获取捕获的值,同样,匹配abc192字符串时,字符串开头不符合正则表达式,立即返回None

re.search(pattern,string[,flags])

search方法与match方法极其类似,区别在于match()函数只从string的开始位置匹配,search()会扫描整个string查找匹配,match()只有在string起始位置匹配成功的时候才有返回,如果不是开始位置匹配成功的话,match()就返回None.search方法的返回对象和match()返回

对象在方法上和属性上是一致的

#coding:utf-8

import re
#将正则表达式编译成pattern对象
pattern = re.compile(r'\d+')

result1 = re.search(pattern,'abc192edf')

if result1 :

print result1.group()

else:

print u'匹配失败1'

 

re.split(pattern,string[,maxsplit])

按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定则将全部分割。示例如下

#coding:utf-8

import re
#将正则表达式编译成pattern对象
pattern = re.compile(r'\d+')

print re.split(pattern,'A1B2C3D4')

re.findall(pattern,string[,flags])

搜索整个string,以列表形式返回能匹配的全部子串。示例如下

#coding:utf-8
import re

pattern = re.compile(r'\d+')

print re.findall(pattern,'A1B2C3D4')

re.finditer(pattern,string[,flags])

搜索整个string,以迭代器形式返回能匹配的全部Match对象。示例如下

#coding:utf-8
import re

pattern = re.compile(r'\d+')

matchiter = re.finditer(pattern,'A1B2C3D4')

for match in matchiter :

print match.group()

re.sub(pattern,repl,string[,count])

使用repl替换string中每一个匹配的子串后返回替换后的字符串。当repl是一个字符串时,可以使用\id或\g<id>、\g<name>引用分组,但不能使用编号0。当repl是一个方法时这个方法应当只接受一个参数,并返回一个字符串用于替换。count

用于指定最多替换次数,不指定时全部替换

#coding:utf-8
import re

pattern = re.compile(r'(?P<world1>\w+) (?P<world2>\w+)') #使用名称引用

s = 'i say,hello world!'

print pattern.sub(r'\g<world2> \g<world1>',s)

p = re.compile(r'(\w+) (\w+)')#使用编号

print p.sub(r'\2 \1',s)

 

posted on 2018-01-22 14:45  paulversion  阅读(146)  评论(0编辑  收藏  举报