正则表达式一直是被我所忽略的东西,因为在之前的学习和开发中基本很少用到它。而且,之前学习正则表达式时感觉很懵逼,所以毅然决然的放弃了(QAQ),然而出来混总归还是要还的。最近在弄日志处理时,必须用到正则表达式,这就让我不得不拿起正则表达式了。在此记录一些自己学习的笔记与案例。
在python中导入re包
import re
一、re.match(pattern,string,flags=0)
尝试从字符串 开始 位置(看清楚,开始位置!!!)匹配一个模式。成功则返回一个match对象,失败则是none
参数说明:
———pattern 正则表达式
———string 字符串
———flags 可选标志位
注:可选标志在下面简单说明
获取对象的方法:
使用group(num) 来获取对象小组内的内容。
举例:
#_*_coding:utf8_*_
import re
str1='010-011-110'
pattern = r'\d{3}-\d{3}-\d{3}'
match = re.match(pattern,str1)
print match.group()
print match.group(0)
print match.group(1)
print match.group(2)
print match.group(3)
#输出为:
010-011-110
010-011-110
010
011
110
match()方法最重要的一点就是它是从字符串开始匹配的,切记这一点······我已经在这点上犯了很多错误了。
在写简单的正则表达式的时候我们可以用()来进行分组,以便于我们在后续处理中取值。后续也会谈到通过命名捕获的方式来取值。
二、re.search(pattern,string,flags=0)
跟match函数参数一样,它也是用来匹配字符串的。而最大的不同在于它可以从字符串的任意位置匹配,不像match一样,仅限于从字符串开始位置。参数跟match一样,就不做说明了,直接上例子。
#与match例子不同,001前面有很多空格
str1=' 001-010-110'
#与match中的模式一样
pattern = r'\d{3}-\d{3}-\d{3}'
#若此时用match()函数,结果肯定是不匹配的。
search = re.search(pattern,str1)
print search.group()
print search.group(0)
print search.group(1)
print search.group(2)
print search.group(3)
#结果:
001-010-110
001-010-110
001
010
110
对于match和search,还是得说一遍,注意一个必须是从字符串开始处匹配,一个是任意位置。
三、检索和替换 re.sub()
用于替换字符串中的匹配项
re.sub(pattern,repl,string,count,flags)
参数说明:
——pattern 正则表达式
——repl 替换的字符串,可为一个函数
——string 要被查找的原始字符串
——count 被替换的次数,默认替换所有匹配项
——flags 标志位
#_*_coding:utf-8_*_
import re
phone = "888-7777-6666 #好牛的号码
#删除字符串中的注释
num = re.sub(r'#.*','',phone)
print num
#删除注释和-
realphone = re.sub(r'\D','',phone)
print realphone
#结果为:
888-7777-6666
88877776666
sub函数理解起来不难,但要主要的是在repl参数的使用。repl可以为一个函数。例如:
将字符串中的数字乘以二
def double(match):
value = int(match.group('value'))
return str(value*2)
s='APPLE23EFG567'
print re.sub(r'(?P<value>\d+)',double,s)
#结果为:
APPLE46EFG1134
因为repl为一个函数,所以再替换的时候会替换为函数的返回值。
注:?P<value>为正则表达式的命名捕获,在下面将会做简单记录
四、正则表达式之命名捕获
格式为: ?P<name>
在处理字符串取值时往往会用到
例子:
num = '001-010-110'
pattern = r'(\d{3})-(\d{3})-(\d{3})'
match = re.match(pattern,num)
print match.group() #001-010-110
print match.group(1) #001
print match.group(2) #010
print match.group(3) #110
在上述例子要分别获取每项的值就要使用group(num),而当正则表达式变得复杂的时候,再用num取值时,很有可能会取到错误的值。所以就提出使用命名捕获,下面为简单例子:
pattern = r'(?P<Area>\d{3})-(?P<zhong>\d{3})-(?P<wei>\d{3})'
match = re.match(patter, num)
print match.group('Area') #001
print match.group('zhong') #010
print match/group('wei') #110
虽然在上述例子中使用命名捕获会将降低正则表达式的可读性,但命名捕获咋复杂的正则中,会准确获取想要的值(当然,正则肯定得写准确啊·····)