前言

正则表达式(RE)是一种小型的、高度专业化的编程语言,python 已经内嵌了正则表达式,并通过RE模块实现。

工作原理:通过一些特定的字符去匹配你想要的内容,将与设定规则匹配的内容返回,不匹配的内容过滤,即不返回。

匹配字符

- 普通字符

例如: test 与 'test' 匹配

- 元字符

.  ^  $  *  +  ?  {}  []  \  |  ( )

定义正则表达式:

正则名 = r ' 正则内容 '

实例:

rule = r'test'

解释:定义一个名为rule的正则,其功能是匹配test字符串.


下面开始讲解正则表达式的元字符:

[ ] 字符集

  • 常用于匹配某一个字符集:如[a-z][A-Z][0-9] ...
  • 元字符在字符集中不起作用,只相当于普通字符:如[abc$ ][ hello* ]...
  • 扩展:匹配字符集以外的字符(补集匹配):[^abc]...,特点:以^符号开头

实例如下:

#!/usr/bin/python   
# -*- coding: utf-8 -*-
     
import re
    
r = r'[a-c]test'  #制定一个首位字符为'a-c'区间的正则
    
print re.findall(r,'atest')   
print re.findall(r,'ctest')   
print re.findall(r,'dtest')

运行输出:

['atest']
['ctest']
[]

可见,以d开头的字符串‘dtest’被过滤掉了。

补集匹配

补集匹配时需要配合字符集[]来使用,当使用字符集[]时,其内部的首位为^时,表示除了字符集以内的所有内容:

实例如下:

#!/usr/bin/python   
# -*- coding: utf-8 -*-   
     
import re   
    
r = r'[^xy]'  # 除 x y 以外的字符   
    
print re.findall(r,'x')   
print re.findall(r,'xy')   
print re.findall(r,'xyabc')   
print re.findall(r,'xiyjk')

实例输出:

[]
[]
['a', 'b', 'c']
['i', 'j', 'k']

解释:定义补集正则,此时除了 xy以外的内容,其它内容都进行输出,与其位置无关。

^ 匹配行首

主要用于匹配字符串的头部(开始)的字符,匹配则输出,不匹配则过滤掉。

实例如下:

#!/usr/bin/python   
# -*- coding: utf-8 -*-   
    
import re   

r = r'^head'  # 输出以‘ head ’开始的字符串   
    
print re.findall(r,'head')   
print re.findall(r,'headfile')   
print re.findall(r,'heartkkk')   
print re.findall(r,'heaaaabb')

实例输出:

['head']
['head']
[]
[]

匹配头部为head的字符串,有则输出该头部信息,没有则不输出。

$ 匹配行尾

用于匹配字符串的尾部(末端)的字符,匹配则输出,不匹配则过滤掉。

实例如下:

#!/usr/bin/python  
#-*- coding: utf-8 -*-  

importre

r= r'end$' # 制定以'end'结尾的字符串
  
printre.findall(r,'end')  
printre.findall(r,'abcend')  
printre.findall(r,'iiienn')  
printre.findall(r,'hello python')

实例输出:

['end']
['end']
[]
[]

\ 转义字符

正则表达式中与其它语言一样使用\进行字符转义,其内部也提供了一些常用的转义字符。

同时可以使用\字符取消所有的元字符,如:\$ , \* ,\+ ...

内部转义字符:

\d:匹配任何十进制数: 相当于字符集 [0-9]
\D:匹配任何非数字字符: 相当于字符集[^0-9]
\s:匹配任何空白字符: 相当于字符集[\t\n\r\f\v]
\S:匹配任何非空白字符: 相当于字符集[^\t\n\r\f\v]
\w:匹配任何字母数字字符:相当于字符集[a-aA-Z0-9]
\W:匹配任何非字母数字字符:相当于字符集[^a-aA-Z0-9]

实例如下:

功能:将元字符 $ 转换为普通字符

#!/usr/bin/python   
# -*- coding: utf-8 -*-   
    
import re   
    
r = r'\$abc'  # 将'$'元字符转义为普通字符   
    
print re.findall(r,'abc')   
print re.findall(r,'$abc')

运行输出:

[]
['$abc']

内部提供转义字符实例:

#!/usr/bin/python   
# -*- coding: utf-8 -*-   
    
import re   
     
r = r'\dyear'  # 用 \d 代替 [0-9]   
    
print re.findall(r,'2year')   
print re.findall(r,'dyear')

运行输出:

['2year']
[]

* 匹配0次或以上

用于指定前一个字符可以被匹配零次或 以上次数,匹配引擎会本着重复尽可能多次数去匹配,一般配合字符集[]使用。

例如:

a[xyz]*b

表示:匹配以'a'开始,‘b’结束,中间是'x''y''z'字符中的任意字符、任意组合及任意次数的组合的字符。

实例如下:

#!/usr/bin/python   
# -*- coding: utf-8 -*-   
  
import re   
  
r = r'hello*'  # 用 * 号制定 o 必须出现 零次或以上   
  
print re.findall(r,'hel')   
print re.findall(r,'hell')   
print re.findall(r,'hello')   
print re.findall(r,'helloo')

运行输出:
[]
['hell']
['hello']
['helloo']

+ 匹配1次或以上

用于指定前一个字符可以被匹配一次或 以上次数,与*字符不一样的就是+字符必须需要指定的字符必须出现1次,而*字符可以是0次。

实例如下:

#!/usr/bin/python   
# -*- coding: utf-8 -*-   
    
import re   
    
r = r'hello+'  # 用 + 号制定 o 必须出现 一次或以上   
    
print re.findall(r,'hell')   
print re.findall(r,'hello')   
print re.findall(r,'helloo')

运行输出:

[]
['hello']
['helloo']

? 可选匹配

指定某一字符或区间字符进行匹配一次或零次,即可有可无的状态。

#!/usr/bin/python  
# -*- coding: utf-8 -*-  
    
import re  
    
r = r'ab?c'  # 指定 b 可有可无  
    
print re.findall(r,'ac')  
print re.findall(r,'abc')  
print re.findall(r,'abbc')

运行输出:

['ac']
['abc']
[]

拓展延伸

贪婪模式非贪婪模式,贪婪模式为最大匹配,非贪婪模式则为最小匹配!

实例如下:

#!/usr/bin/python  
# -*- coding: utf-8 -*-  
    
import re  
    
r = r'ab*'     # 贪婪模式(最大匹配)  
s = r'ab*?'    # 非贪婪模式(最小匹配)  
    
print re.findall(r,'abbbbbb')  
print re.findall(s,'abbbbbb')

运行输出:

['abbbbbb']
['a']

{m,n} 区间限定符

表示将某一字符限定在某一区间内,该限定符的规则为至少重复m次,最多重复n次。其中m,n均为整数。
当忽略m时,默认下边界(至少)为0,而忽略n时,默认上边界(至多)为无穷(0~20亿次)。

实例如下:

#!/usr/bin/python  
# -*- coding: utf-8 -*-  

import re  
    
r = r'ab{2,5}c'  # 指定 b 重复次数在 2~5 次之间  
    
print re.findall(r,'abc')     #重复 1 次  
print re.findall(r,'abbc')      #重复 2 次  
print re.findall(r,'abbbbbc')     #重复 5 次  
print re.findall(r,'abbbbbbc')      #重复 6 次

运行输出:
[]
['abbc']
['abbbbbc']
[]

最后修改:2022 年 06 月 09 日
如果觉得我的文章对你有用,请随意赞赏