python正则表达式学习记录

引入

正则表达式,说白了就是一个特殊字符串。其主要作用是作为一个模板来匹配目的字符串,从而操作字符串。

语法

正则表达式这个字符串是由字母、数字和符号组成,每个字符都表示独特的意义,而不同的字符拼在一起又可以表示不同的字符串,用法较为灵活。所以,正则表达式语言简单,如何灵活拼凑使用才是难点~

字母和数字:单纯的字母和数字表示自身,无特殊含义。
/字母:部分字母前加上反斜杠可以表示特殊的含义。

/字母 含义
\w 表示数字、字母、下划线
\W 表示除 数字、字母、下划线 之外
\s 表示空白字符
\S 表示除 空白字符 之外
\d 表示数字
\D 表示除 数字 之外
\A 表示字符串开始,和^相同
\Z 表示字符串结束,和$相同
\b 表示单词边界,即单词和空格组成的位置
\B 表示除 单词边界 之外
\n 表示换行符
\r 表示回车符
\t 表示 tab 符

符号:正则表达式中的符号有着不同的含义。如果想要表示自身含义需要在符号前加转义字符,例如\*。

符号 含义
\ 转义字符
. 表示换行符外的任意字符
* 用来修饰其他表达式,表示0个或多个表达式,a*
+ 用来修饰其他表达式,表示1个或多个表达式,a+
用来修饰其他表达式,表示0个或1个表达式 ,a?
[] 表示 中括号内众多表达式其中一个 ,[abc]表示a或b或c
[^] 表示除 中括号内众多表达式 之外
{n} 用来修饰其他表达式,表示n个表达式,a{3}表示 aaa
{n,} 用来修饰其他表达式,表示大于等于n个表达式,a{3,}表示aaa,aaaa,aaaaa等等
{n,m} 用来修饰其他表达式,表示大于等于n,小于等于m个表达式
| 表示或,a|b
^ 表示字符串开始的位置
$ 表示字符串结尾的位置
() 表示一个子表达式(匹配项),(abc)
(?=) 表示在表达式开始处匹配字符串,表达式也就是你要查找的字符串的前面字符串

优先级:运算符优先级从高到低依次是:\(转义符) > (),(?=),[](括号) > ^,$,任何字符 > |(或)

贪婪与懒惰
针对于字符串 :

Hello


贪婪的:正则表达式:r‘<.*>’。所匹配到的结果是:

Hello


懒惰的:正则表达式:r<.*?>。所匹配到的结果是:


从匹配结果我们可以看出:贪婪的会在满足条件下匹配最多的字符,而懒惰的会在满足条件下匹配最少的字符。*和+默认都是贪婪的,在他们后面加上一个?就可以变成懒惰的。

子表达式:我们可以用将部分字符放到()里,将部分字符当做一个整体,在用其他字符修饰这个整体。
针对于IP的匹配:255.255.255.0
方式一:r’\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}’
方式二:r’(\d{1,3}.){3}\d{1,3}’
对比这两种方式,方式二就是我们所说的子表达式:我们将\d{1,3}.(也就是255.)看做一个整体放到()里,匹配三次,然后不带.的(也就是0)再单独匹配一次。这样写不仅方便,貌似也提升了逼格。

向前向后查找:(?<=xxx)表示被匹配的字符串前必须有xxx,(?=ooo)表示被匹配字符串后必须有ooo。当我们想要匹配某个字符串时,我们可以使用前向和后向匹配:(?<=xxx)字符串(?=ooo)。
针对于字符串:

Hello

,匹配出 Hello
表达式:r‘(?<=

).*?(?=

)’
我们分别用前向匹配和后向匹配限定字符串的两侧,中间再匹配目的字符串。要说明的是前向和后向表达式可以根据需要选择其中一个。

回溯引用:我们可以通过“\数字”的方式来匹配第几个子表达式的内容。
需求:匹配

Hello

,

Hello

,

Hello

其中任何一个标签中的内容。
表达式1:r’(?<=).*?(?=)’
我们使用向前向后查找;另外用来表示前标签,[1-3]放入()中表示一个子表达式,表示后标签,其中的\1表示第一个子表达式的内容,所以当前表达式取1的时候,后表达式也取1,从而达成了配对。

表达式2:r’(?<=[1-6])>).*?(?=)’
(?P)是给子表达式起别名为name,而(?P=name)是引用名字是name的子表达式。

补充:细心的你可能会发现,我的每一个表达式都前面都加了一个r,r是防转义字符。当你想要匹配’\t’这个字符串时,如果前面不加r,则会解析为tab符。总之,在写正则表达式字符串时前面最好加一个r。

re模块

re模块是Python内置的模块,通过正则表达式来匹配字符串。别忘了使用前导入模块:

import re

re.match()方法:从目的字符串开始位置就匹配正则表达式,匹配成功返回SRE_Match对象,失败返回None,只匹配一个符合部分。该方法第一个参数是正则表达式字符串或正则表达式对象(下文有介绍);第二个参数是目的字符串;第三个(可选)参数是标志位,常用的是re.I,代表不区分大小写。
荔枝:我们的正则表达式是Www,目的字符串是 www.baidu.com,不区分大小写。

result=re.match(r'Www','wwww.baidu.com',re.I)
print(result.group())
print(result.span())

结果如图:需要说明的是匹配对象调用group(num=0)方法返回的是匹配整个表达式的字符串,传入num参数则会返回对应的第几个子表达式的匹配内容,可以一次传入多个num;span()方法则会返回匹配的字符串在目的字符串的起止位置。
结果图1

re.search()方法:在目的字符串中寻找匹配正则表达式的字符串,匹配成功返回SRE_Match对象,失败返回None,只匹配一个符合部分。该方法第一个参数是正则表达式字符串或正则表达式对象;第二个参数是目的字符串;第三个(可选)参数是标志位。
荔枝:我们的正则表达式是(?<=

).*?(?=

),目的字符串是

Hello

result=re.search(r'(?<=

).*?(?=

)'
,'

Hello

'
,) print(result.group())

结果如图:
结果图2
需要说明的是:match方法和search方法都是从目的字符串中匹配正则表达式,不同点在于match方法是从目的字符串开始就进行匹配,而search则是在字符串中任意位置开始匹配上即可。

re.findall()方法:用来在目的字符串匹配出所有符合正则表达式的字符串,返回值是一个列表(即使是包含一个结果的列表或者是空列表)。第一个参数是正则表达式或正则表达式对象,第二个参数是目的字符串,第三个可选参数是匹配的起始位置,第四个可选参数是匹配的结束位置。
荔枝:正则表达式是\d+,匹配数字的意思;目的字符串是one12twothree34four;这里没有设置匹配的起止位置,默认是在目的字符串中任意位置匹配

print(re.findall(r'\d+','one12twothree34four'))

结果如图:
结果图4

re.sub()方法:在目的字符串中匹配正则表达式,并将匹配部分替换成其他内容。第一个参数是正则表达式字符串或正则表达式对象;第二个参数是替换的新内容,可以是一个字符串也可以是一个函数;第三个参数是目的字符串;第四个可选参数是count,替换的最大次数,默认为0替换全部。
荔枝1:正则表达式是-,新内容是空字符串,目的字符串是1234-567-89

num=re.sub(r'-','','1234-567-89')
print(num)

结果如图:
结果图3
荔枝2:将字符串中的数字乘以2。这里的传入的第二个参数也就是新内容就是一个函数,这个函数需要一个参数用来表示匹配上的字符串(名字任意),该参数先是将匹配上的字符串中叫value的子表达式转换成int类型,然后将int类型乘以2转为str类型返回;至于正则表达式,\d+不用多说表示数字,(?P)是应该给匹配上的子表达式起名字叫value。

def double(matched):
    value =int(matched.group('value'))
    return str(value*2)

s='A23G4HFD567'

print(re.sub(r'(?P\d+)',double,s))

结果如图:
结果图4

re.split()方法:将目的字符串按照匹配正则表达式的位置分割开,以列表的形式返回。第一个参数是正则表达式字符串或正则表达式对象;第二个参数是目的字符串;第三个可选参数maxsplit=0,表示最大的分割此时,默认0是不限次数;第四个参数flags是标志位。
荔枝:正则表达式\W+是匹配非字母;目的是字符串是 www.baidu.com ;没设置maxsplit,默认0。

print(re.split('\W+','www.baidu.com'))

结果如图:
结果图6

re.compile()方法:用来根据正则表达式字符串生成一个正则表达式对象。第一个参数是正则表达式字符串;第二个可选参数是标志位。
荔枝:我们先根据\W+生成了正则表达式对象;然后既可以用正则表达式对象调用之前的学过方法,也可以用re来调用方法将正则表达式对象传入。

pe=re.compile('\W+')
print(pe.split('www.baidu.com'))
print(re.split(pe,'www.baidu.com'))

结果如图:
结果图7

参考:
http://www.cnblogs.com/chuxiuhong/p/5907484.html(感谢作者)

你可能感兴趣的:(Python)