正则表达式
正则表达式即RE,我们可以使用正则表达式来匹配字符串集,其实正则表达式是一个小型的编程语言。它可以方便我们对于文本任务的操作。
对于python来说,re模块就是正则式操作模块。
元字符:元字符是特殊的字符,普通的字符在正则表达式中都可以用来匹配自己,如正则表达式‘zhang’可以匹配字符串‘zhang’,但是元字符有他特殊的含义。元字符有: . ^ $ * ? [] {}()
常用的就是这7个。依次介绍:
1:中括号 [] :作用是指定一个字符类,即用来存放需要匹配的字符串集合,该集合成为一个字符类,例如: [PTU] 含义是:匹配字符P、T或者U,含有一种形式:[a-c] 含义是:匹配字符a、b或者c
特别的,元字符在中括号中就丧失了它的特殊意义,变成了普通字符,也就是可以匹配元字符本身了。例如:[ZD$] 含义是:匹配字符Z、D或者$。
2:^ 是脱字符号,例子:[^1] 匹配除了1以外的任何字符。
3: 反斜杠\:很重要,正则表达式中用的最多。反斜杠\ 加元字符可以将元字符转成普通字符。丧失其元字符的特殊含义。例如正则表达式:‘ \*’含义是匹配字符*。‘\?’含义是匹配字符问号?
4:反斜杠加上一些普通字符可以表示一些特殊功能。列举:\d 匹配任何十进制数字字符 相当于 [0-9]
\D 匹配任何非十进制数字字符
\s 匹配任何空白字符(空格 回车 制表键)
\w 匹配任何单词字符
这些都可以加入到字符类(中括号)中。
5: . 点:它匹配了换行符以外的任何字符 例如:正则式‘Z.U’匹配ZAU 或者ZBU等字符串
以上都是匹配字符,
我们还可以一下元字符来匹配字符串:
6: * :匹配前一个字符的0次或者多次
7: + :匹配前一个字符1次或者多次
8: ?:匹配前一个字符0次或者1次
9: 花括号{} 例如{m,n} 表示前一个字符必须要匹配m到n次之间。
当然花括号可以代替前面的6,7,8元字符。不在赘述
在python中使用正则表达式
Python中的re模块,就是正则式模块。一般情况下,我们将正则式字符串编译成模式对象,然后对其进行操作。
编译方法如下: p=re.compile(r‘zhangruilin’) 稍后会解释为什么字符串前面带一个r字符。 其中正则正则表达式作为一个字符传入函数,然后函数返回一个模式对象。
现在解释下正则表达式字符串前面为什么会有一个字符r,在正则表达式中,我们都知道反斜杠会让一些普通字符具有特殊含义,例如\d,我们想要匹配反斜杠,就要在反斜杠前面加入一个反斜杠,即\\。
同样,在python,反斜杠同样有特殊含义(即\\ 表示\),例如我们要匹配’\zhangruilin’ 则正则式表示为 ‘\\zhangruilin’ 进而,在python中 最终要写成’\\\\zhangruilin’ 才可以。大家若是不理解,就直接记住,在匹配字符串时候,正则式字符串前面加上字符r即可。所以要匹配字符串’\zhangruilin’ 正则式字符串表示为:‘\\zhangruilin‘这样就更加简单。
10: 匹配函数:将正则表达式字符串编译后,成为模式对象,对于模式对象,我们有很多操作函数。
Findall match search 接下来一一介绍。
Findall()函数:遍历字符串,找到匹配成功的所有位置,然后以列表的形式返回
Match()函数:判断正则表达式是否从开始出匹配,若是,返回一个匹配对象,若不是返回none
Search() 遍历字符串找到匹配的第一个位置(因为一个字符串中可以有多个匹配成功的子字符串)
同时对于match ()和search()返回的匹配对象,我们有如下操作:
Group() 返回匹配的字符串(默认是贪婪的,关于正则表达式默认是贪婪匹配的)
Start() 返回匹配的字符串在元字符串中的起始位置
Span()返回匹配的字符串在元字符串中的范围
End() 返回匹配的字符串在元字符串中的结束位置
以上的所有操作如下图:
>>>import re #导入模块
>>>ZZBDS=re.compile(r'\.zhang*[abc]*') #编译正则表达式,生成模式对象
>>>str1='.zhan' #匹配字符串
>>>a=ZZBDS.match(str1) #使用match函数 :正则式对象 ZZBDS 从头匹配str1,则返回匹配对象
>>>a.span() #返回匹配范围
(0, 5)
>>>a.start() #返回匹配开始位置
0
>>>a.end() #返回匹配结束位置的下一个 注意:真正结束位置是4
5
>>>str2='zhang'
>>> b=ZZBDS.match(str2) #匹配失败,ZZBDS表达式第一个匹配要求为 . 匹配失败
>>>type(b) #匹配失败,返回空
<class'NoneType'>
>>>str3='.zhanggggaaaa'
>>>c=ZZBDS.match(str3)
>>>c.span()
(0, 13)
>>>c.start()
0
>>>c.end()
13
>>>str4='.zhanabc'
>>>d=ZZBDS.match(str4)
>>>type(d)
<class'_sre.SRE_Match'>
>>>d.span()
(0, 8)
>>>d.end()
8
>>>d.start()
0
>>>str5='zzu.zhangggggdddda'
>>>e=ZZBDS.search(str5) #遍历字符串,找到匹配的第一个位置
>>>e.span()
(3, 13)
import re
ZZBDS=re.compile(r'\.zhang*[abc]*')
str1='.zhan'
a=ZZBDS.match(str1)
a.span()
a.start()
a.end()
str2='zhang'
b=ZZBDS.match(str2)
b
str3='.zhanggggaaaa'
c=ZZBDS.match(str3)
c.span()
c.start()
c.end()
str4='.zhanabc'
d=ZZBDS.match(str4)
str5='zzu.zhangggggdddda'
e=ZZBDS.search(str5)
str6='zzu.zhangggggdddd'
f=ZZBDS.search(str6)