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)