请给我10分钟,我有把握让你10分钟上手正则表达式。
用一句通俗的语言解释:正则表达式就是记录文本规则的代码。
正则表达式之所以难学,是因为它有大量的符号,每个符号的意义和用法又是不一样的,但是只要掌握了用法,正则表达式也可以很友好。
本文中所有的代码都在python的re模块下运行。
常用字符
在常用字符中,除了·,其余的字符都是由\和字母所组成,可以发现,小写字母和大写字母所表达的意义是相反的。所以正则表达式还是有一定的规律可循。
![](https://img.haomeiwen.com/i8134750/975dbe81c52075f0.png)
实例:
1)\d是匹配字符串中的数字,在用search方法的时候匹配到第一个数字即返回,用findall即可以匹配到所有的数字。
"\d"
import re
print(p.search('zy3t4r1').group())
3
print(p.findall('zy3t4r1'))
['3', '4', '1']
2)\w可以匹配单词字符,数字和字母:[A-Za-z0-9]。
"\w" :单词字符,数字和字母:[A-Za-z0-9]
import re
p=re.compile('\w')
print(p.search('1a2b3c').group())#匹配最先出现的字符 1
print(p.match('1a2b3c').group())
1
print(p.findall('1a2b3c')) #匹配所有符合条件的字符 ['1', 'a', '2', 'b', '3', 'c']
3)\s和\S表示的意思相反,\s会匹配 \t、\r、\n、空格的字符,\S则匹配的是非空白的字符。
"\s"
import re
p=re.compile('\s')
p.search('\rab1 \ncd2 \tef3').group()
p.match('\rab1 \ncd2 \tef3').group()
print(p.findall('\rab1 \ncd2 \tef3'))
['\r', ' ', '\n', ' ', '\t']
"\S"
import re
p=re.compile('\S')
p.search('\rab1 \ncd2 \tef3').group()
print(p.findall('\rab1 \ncd2 \tef3'))
['a', 'b', '1', 'c', 'd', '2', 'e', 'f', '3']
重复字符
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
![](https://img.haomeiwen.com/i8134750/51ca07765be1dda6.png)
实例:
1)"?" 重复0次或1次,在使用match,search时,对于不匹配的字符不会返回none,而会出现' '(空值)。
"?"
p = re.compile('[abc]?')
print(p.match('abcdefabc').group())
'a'
print(p.search('abcdefabc').group())
'a'
print(p.findall('abcdefabc')) #0次和1次 ['a', 'b', 'c', '', '', '', 'a', 'b', 'c', '']
2)"{n}" 匹配字符串出现n次
"{n}"
import re
p = re.compile('[dc]{2}') #d或则c出现2次 print(p.search('ddattaccstle').group())#匹配第一次出现的字符串,d比c先出现 dd
print(p.findall('ddattaccstle')) #匹配出现的所有字符串,列表形式返回 ['dd', 'cc']
3)"{n,m}"匹配字符串出现n到m次
"{n,m}"
import re
p= re.compile('[dc]{2,4}') #d或则c出现2到4次 print(p.match('ddastleccc').group()) #匹配开头 dd
print(p.search('ddastleccc').group()) #匹配第一次出现的项 dd
print(p.findall('ddastleccc')) #匹配所有项 ['dd', 'ccc']
分组语法
我们已经知道直接在字符后面加上限定符就可以进行单个字符的重复,但如果想要重复多个字符又该怎么办?可以通过分组来进行操作。
![](https://img.haomeiwen.com/i8134750/2168be7df2f22e6d.png)
实例:
分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。
分完组以后,要想获得某个分组的内容,直接使用group(num)和groups()函数去直接提取就行。
利用分组输出电话号码
import re
m=re.search(r'(\d{3})-(\d{3})-(\d{4})','My phone number is 028-888-5566') #每个括号为一个组 print(m.group(1)) #返回第一组的值 028
print(m.group(2))
888
print(m.group(3))
5566
print(m.group())#返回整个匹配的文本 028-888-5566
边界匹配
![](https://img.haomeiwen.com/i8134750/a67c8e4a7872bac1.png)
实例:
1) "$" :匹配字符串结尾
"$"
import re
p = re.compile('[abc]$')
print(p.findall('adefAbc'))
['c']
2) "\A":匹配字符串开头,下面的例子是匹配从a开始的字符串,使用findall(),返回的是开头的两个a。
"\A"
import re
p= re.compile('\A[a]+')
p.search('aabbcc').group()
print(p.findall('aabbcc'))
['aa']
其它字符
正则表达式涉及的字符非常多,在这里就不再一一进行讲解,只要掌握了正则表达式的一般用法,注意符号和用法,非常容易上手。
![](https://img.haomeiwen.com/i8134750/168763ad0b566a9c.png)
你可能看到,在上面的例子当中,有几个出现很频繁的函数,compile()、match()、search()......这些是python当中很常见的一些函数。
-compile()
创建一个正则表达式对象,compile() 函数将一个字符串编译为字节代码。
格式:
re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
flags:编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。
该函数根据包含的正则表达式的字符串创建模式对象。
在直接使用字符串表示的正则表达式进行search,match和findall操作时,python会将字符串转换为正则表达式对象。
而使用compile完成一次转换之后,在每次使用模式的时候就不用重复转换。
当然,使用re.compile()函数进行转换后,re.search(pattern,string)的调用方式就转换为 pattern.search(string)的调用方式。
import re
a = "Today is sunday"
b = re.compile(r'\wa\w')
print(b.findall(a)) #查找所有包含'a'的单词 ['Today', 'sunday']
-group()
获取匹配的字符串,可以在分组时使用,也可以在search(),match()中使用,最后的结果都是为了返回符合条件的字符串。在本文中几乎每处都有用到,就不再举例说明。
-match()
决定RE是否在字符串刚开始的位置匹配。//注:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'
格式:
re.match(pattern, string, flags=0)
实例:
import re
print(re.match('data','datawww.castle.com').group())
data
print(re.match('data','datawww.castle.com',re.I).group())
data
-search()
在字符串中查找对象。
格式:
re.search(pattern, string, flags=0)
re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
import re
print(re.search('\d','www.3data4castle.com').group())
3
-findall()
查找此字符串中的所有匹配项,而不仅仅是第一个匹项。
格式:
re.findall(pattern, string, flags=0)
re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
import re
p = re.compile(r'\d+')
print(p.findall('1a2b3c4d5f'))
['1', '2', '3', '4', '5']
利用十分钟你可以上手正则表达式,但不可能掌握它,最重要的事情是练习!练习!再练习!
网友评论