正则表达式,说白了就是一个特殊字符串。其主要作用是作为一个模板来匹配目的字符串,从而操作字符串。
正则表达式这个字符串是由字母、数字和符号组成,每个字符都表示独特的意义,而不同的字符拼在一起又可以表示不同的字符串,用法较为灵活。所以,正则表达式语言简单,如何灵活拼凑使用才是难点~
字母和数字:单纯的字母和数字表示自身,无特殊含义。
/字母:部分字母前加上反斜杠可以表示特殊的含义。
/字母 | 含义 |
---|---|
\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‘<.*>’。所匹配到的结果是:
子表达式:我们可以用将部分字符放到()里,将部分字符当做一个整体,在用其他字符修饰这个整体。
针对于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)。
针对于字符串:
回溯引用:我们可以通过“\数字”的方式来匹配第几个子表达式的内容。
需求:匹配
表达式2:r’(?<=
(?P
补充:细心的你可能会发现,我的每一个表达式都前面都加了一个r,r是防转义字符。当你想要匹配’\t’这个字符串时,如果前面不加r,则会解析为tab符。总之,在写正则表达式字符串时前面最好加一个r。
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()方法则会返回匹配的字符串在目的字符串的起止位置。
re.search()方法:在目的字符串中寻找匹配正则表达式的字符串,匹配成功返回SRE_Match对象,失败返回None,只匹配一个符合部分。该方法第一个参数是正则表达式字符串或正则表达式对象;第二个参数是目的字符串;第三个(可选)参数是标志位。
荔枝:我们的正则表达式是(?<=
result=re.search(r'(?<=).*?(?=
)','Hello
',)
print(result.group())
结果如图:
需要说明的是:match方法和search方法都是从目的字符串中匹配正则表达式,不同点在于match方法是从目的字符串开始就进行匹配,而search则是在字符串中任意位置开始匹配上即可。
re.findall()方法:用来在目的字符串匹配出所有符合正则表达式的字符串,返回值是一个列表(即使是包含一个结果的列表或者是空列表)。第一个参数是正则表达式或正则表达式对象,第二个参数是目的字符串,第三个可选参数是匹配的起始位置,第四个可选参数是匹配的结束位置。
荔枝:正则表达式是\d+,匹配数字的意思;目的字符串是one12twothree34four;这里没有设置匹配的起止位置,默认是在目的字符串中任意位置匹配
print(re.findall(r'\d+','one12twothree34four'))
re.sub()方法:在目的字符串中匹配正则表达式,并将匹配部分替换成其他内容。第一个参数是正则表达式字符串或正则表达式对象;第二个参数是替换的新内容,可以是一个字符串也可以是一个函数;第三个参数是目的字符串;第四个可选参数是count,替换的最大次数,默认为0替换全部。
荔枝1:正则表达式是-,新内容是空字符串,目的字符串是1234-567-89
num=re.sub(r'-','','1234-567-89')
print(num)
结果如图:
荔枝2:将字符串中的数字乘以2。这里的传入的第二个参数也就是新内容就是一个函数,这个函数需要一个参数用来表示匹配上的字符串(名字任意),该参数先是将匹配上的字符串中叫value的子表达式转换成int类型,然后将int类型乘以2转为str类型返回;至于正则表达式,\d+不用多说表示数字,(?P
def double(matched):
value =int(matched.group('value'))
return str(value*2)
s='A23G4HFD567'
print(re.sub(r'(?P\d+)' ,double,s))
re.split()方法:将目的字符串按照匹配正则表达式的位置分割开,以列表的形式返回。第一个参数是正则表达式字符串或正则表达式对象;第二个参数是目的字符串;第三个可选参数maxsplit=0,表示最大的分割此时,默认0是不限次数;第四个参数flags是标志位。
荔枝:正则表达式\W+是匹配非字母;目的是字符串是 www.baidu.com ;没设置maxsplit,默认0。
print(re.split('\W+','www.baidu.com'))
结果如图:
re.compile()方法:用来根据正则表达式字符串生成一个正则表达式对象。第一个参数是正则表达式字符串;第二个可选参数是标志位。
荔枝:我们先根据\W+生成了正则表达式对象;然后既可以用正则表达式对象调用之前的学过方法,也可以用re来调用方法将正则表达式对象传入。
pe=re.compile('\W+')
print(pe.split('www.baidu.com'))
print(re.split(pe,'www.baidu.com'))
参考:
http://www.cnblogs.com/chuxiuhong/p/5907484.html(感谢作者)