欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

从零开始的Python学习Episode 15——正则表达式

程序员文章站 2022-06-30 12:11:51
正则表达式 正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现,所以使用时要导入re模块。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。 先说几个元字符 . ^ $ * + ? { } 元字符:[ ] ......

正则表达式

 

正则表达式(或 re)是一种小型的、高度专业化的编程语言,(在python中)它内嵌在python中,并通过 re 模块实现,所以使用时要导入re模块。正则表达式模式被编译成一系列的字节码,然后由用 c 编写的匹配引擎执行。

 

先说几个元字符  . ^ $ * + ? { }

 

import re

ret = re.findall('t...r', 'hellotomorrow')
print(ret)  # ['tomor']

ret = re.findall('^r.w', 'r1whellotomorr2w')
print(ret)  # ['r1w']

ret = re.findall('r.w$', 'r1whellotomorr2w')
print(ret)  # ['r2w']
ret = re.findall('hello$', 'r1whellotomorr2w')
print(ret)  # ['awwwn']

ret = re.findall('abc*', 'abcccc')  # 贪婪匹配[0,+oo]
print(ret)  # ['abcccc']
ret = re.findall('abc*', 'ab')  # 贪婪匹配[0,+oo]
print(ret)  # ['ab']

ret = re.findall('abc+', 'abccc')  # [1,+oo]
print(ret)  # ['abccc']

ret = re.findall('abc?', 'abccc')  # [0,1]
print(ret)  # ['abc']

ret = re.findall('abc{1,4}', 'abccc')
print(ret)  # ['abccc'] 贪婪匹配

ret=re.findall('abc*?','abcccccc')
print(ret)#['ab'] 当* + ?的后面再加上?的话就会变成惰性匹配

 

元字符:[ ]

import re
ret = re.findall('a[bc]d','abd')
print(ret)#['abd'],选b或c

ret = re.findall('[a-z]','abd')
print(ret)#['a', 'b', 'd'],选出a到z的元素

ret = re.findall('[.*+]','a.b+c*')
print(ret)#['.', '+', '*'],消除某些元字符的特殊功能

ret = re.findall('[1-9]','adc51ca')
print(ret)#['5', '1'],选出1到9之间的数字

ret = re.findall('[^ab]','jnan21b')
print(ret)#['j', 'n', 'n', '2', '1'],选出除了a,b的元素

ret = re.findall('\dc','123 cad#4')
print(ret)#['1', '2', '3', '4'],选出数字

 

元字符的转义符

反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d

\d  匹配任何十进制数;它相当于类 [0-9]。
\d 匹配任何非数字字符;它相当于类 [^0-9]。
\s  匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\s 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-za-z0-9_]。
\w 匹配任何非字母数字字符;它相当于类 [^a-za-z0-9_]
\b  匹配一个特殊字符边界,比如空格 ,&,#等

 

有一种特殊情况:

import re
m = re.findall('\bblow', 'blow')
print(m)#[]
m = re.findall('\\bblow', 'blow')
print(m)#['blow']
m = re.findall(r'\bblow', 'blow')
print(m)#['blow']

这是因为在python解释器中“\\”才相当于一个“\”,而光写一个“\”是不能被识别的。

 

元字符( )分组

 

ret = re.search('(?p<id>\d{3})/(?p<name>\w{2,3})', '233/cn')
print(ret.group())#233/cn
print(ret.group('id'))#233

这段代码的意思是以‘/’为界限分为名为id(3个数字)和名为name(2个或3个字母)的两个组,其中(?p<xxx>)是固定的格式,但可以不用这种格式。如果没有用这种格式则没有办法按名字来访问组中的数据,按需求来选择是否要用。而search()是扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配。

 

re.compile()

compile()可以编译正则表达式模式,返回一个对象。可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。

import re

ret = re.compile('(\d{3})/(\w{2,3})')
print(ret.search('233/cn').group())
#233/cn

 

re.match()

只检测是不是在string的开始位置匹配,若在开头检测不到,则返回空。

ret = re.match('233','2334567')
print(ret)
#<re.match object; span=(0, 3), match='233'>
#可以通过ret.span()查看其终止点,通过ret.group()查看匹配到的内容。

 

re.search()

扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配.

import re

ret = re.compile('(\d{3})/(\w{2,3})')
print(ret.search('233/cn').group())
#233/cn,也可以像match那样用span和group

 

re.split()

原型是re.split(pattern, string, maxsplit=0)

通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。

import re

ret = re.split('s','adsnjfsnja')
print(ret)
#['ad', 'njf', 'nja']