(一)正则表达式概述
1.定义
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。在 需要通过正则表达式对字符串进行匹配的时候,Python提供了一个re模块,我们通过这个模块来操作字符串。
2.正则表达式的作用
- 快速检索文本,实现字符或字符串的替换操作。比如:
- 检查一串数字是否是电话号码
- 检查一串字符串是否符合email
- 检查一串字符串是否符合身份证号码或日期格式等等。
1.re模块的使用过程
#1.导入re模块
import re
#2.使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
#3.如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()
注:re.match是用来进行正则匹配检查的方法,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。
2.实例演示
方式一
#1.导入re模块
import re
s='Hello world 123@#$%'
#2.将满足'123@全部匹配出来,并保存在列表中
result=re.findall('123@',s)
print(result)
----------
方式二
#1.导入re模块
import re
#2.匹配以Hello开头的单词,如果匹配其他字符串返回结果为:NoneType
#3.注:re.match() 能够匹配出以xxx开头的字符串
result = re.match("Hello", "Hello world 123@ #$%")
print(type(result))
print(result.group())
(二)匹配字符串
1.语法如图所示
2.知识点01——字符集
1.匹配边界为ac,中间字符为c或f的字符串
这里写代码片#知识点01-字符集
#1.导入re模块
import re
s='abc,acc,adc,afc,'
#2.获取acc或afc(普通字符和元字符组合使用)
#3.匹配中间不是cf的字符串:'a[^cf]c'
list=re.findall('a[cf]c',s)
print(list)
结果演示:['acc', 'afc']
2.匹配数字的四种方式
import re
s='a1b2c3d'
#2.把s中的数字全部匹配出来,并保存在列表中
'''
3.匹配数字的四种方式:
01.re.findall('[0-9]',s)
02.re.findall('[0,1,2,3,4,5,6,7,8,9]',s)
03.re.findall('\d',s)
04.re.findall('[^a-z]',s)
'''
list=re.findall('[0-9]',s)
print(list)
3.匹配字符的三种方式
import re
s='a1b2c3dEF'
#2.把s中的字符全部匹配出来,并保存在列表中
'''
3.匹配字符串的三种方式:
01.re.findall('[^0-9]',s)
02.re.findall('[a-z]',s)
03.re.findall('[A-Z]',s)
'''
list=re.findall('[a-z]',s)
print(list)
结果演示:['a', 'b', 'c', 'd']
4.匹配数字、字母、下划线的两种方式
import re
#1.无法匹配@字符
s='a1b2c3dE_F@'
'''
匹配单个字符,0-9、a-z、a-z、_:
01.list=re.findall('\w',s)
02.re.findall('[0-9a-zA-Z_]',s)
'''
#2.也可以这样写:re.findall('[0-9,a-z,A-Z_]',s)
list=re.findall('[0-9a-zA-Z_]',s)
print(list)
结果演示:['a', '1', 'b', '2', 'c', '3', 'd', 'E', '_', 'F']
5.匹配空格和匹配非空格
import re
s='Hello World'
#1.匹配空格
list01=re.findall('\s',s)
#1.匹配非空格
list02=re.findall('\S',s)
print(list01)
print(list02)
结果演示:
[' ']
['H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd']
(三)表示数量
匹配多个字符的相关格式:
1.匹配单词
import re
s='Hello World Kainnna 123'
#1.数量词匹配单词,将单词开头大小写的全部匹配出来
list01=re.findall('[a-zA-z]{5}',s)
list02=re.findall('[a-zA-z]{5,7}',s)
list03=re.findall('[a-zA-z]{5,}',s)
print("匹配5个字母的单词:"+str(list01))
print("匹配5-7个字母的单词:"+str(list02))
print("匹配5个以上字母的单词:"+str(list03))
结果演示:
匹配5个字母的单词:['Hello', 'World', 'Kainn']
匹配5-7个字母的单词:['Hello', 'World', 'Kainnna']
匹配5个以上字母的单词:['Hello', 'World', 'Kainnna']
2.贪婪和非贪婪
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。
01.贪婪模式实例
import re
s='Hellohaha@ World123me'
'''
贪婪模式:
01.总是尝试匹配尽可能多的字符
比如:正则表达式限制单词字母的范围是1-5,
如果条件允许,它会匹配5个字母的单词而不会
匹配出1-4个字母的单词,这就是贪婪。
'''
list=re.findall('[a-zA-Z]{1,5}',s)
print(list)
结果演示:['Hello', 'haha', 'World', 'me']
02.非贪婪模式实例
import re
s='Hellohaha@ World123me'
'''
非贪婪模式:
01.re.findall('[a-zA-Z]{2,5}?',s)等价于re.findall('[a-zA-Z]{2}',s)
'''
#1.非贪婪满足花括号前面的数字即可!
list=re.findall('[a-zA-Z]{2,5}?',s)
print(list)
结果演示:['He', 'll', 'oh', 'ah', 'Wo', 'rl', 'me']
3.匹配0次1次或无限多次
import re
'''
01.*匹配0次或者无数多次
02.+匹配1次或者无数多次
03.匹配0次或1次
'''
s='HellHello1Helloo2'
#1.匹配o出现0次或者无数多次
list01=re.findall('Hello*',s)
#2.匹配o出现1次或者无数多次
list02=re.findall('Hello+',s)
#3.匹配o出现0次或1次
list03=re.findall('Hello?',s)
print(list01)
print(list02)
print(list03)
结果演示:
['Hell', 'Hello', 'Helloo']
['Hello', 'Helloo']
['Hell', 'Hello', 'Hello']
(四)边界匹配符
表示边界的字符格式:
1."^“和”$"匹配边界
import re
'''
1.QQ号数字为:5-9位数
2.'^':匹配字符串开头
3.'$':匹配字符串结尾
'''
qq='123456'
email='123456@163.com'
#list=re.findall("[\w]{4,20}@163\.com",email)
#list=re.findall("[\w]{4,20}@163\.com$",email)
list=re.findall('^\d{5,9}$',qq)
if len(list)>0:
print("匹配成功!")
else:
print("匹配失败!")
print(list)
结果演示:匹配成功!['123456']
(五)匹配分组
如图所示:
1.实例演示
import re
'''
匹配分组
1."|":匹配左右任意一个表达式
2.匹配出163、126、qq邮箱之间的数字
'''
list01=re.findall('[1-9]?\d','8abc')
print(list01)
list02=re.findall('[1-9]?\d','78abc')
print(list02)
list03=re.findall('[1-9]?\d$','078abc088')
print(list03)
list04=re.findall('^[1-9]?\d$|100','78abc088 ')
print(list04)
list05=re.findall('^[1-9]?\d$|100','78abc088and100 ')
print(list05)
list06=re.findall('\w{4,20}@(163|126|qq)\.com','123456@qq.com')
print(list06)
list07=re.findall('<[a-zA-Z]*>\w*</[a-zA-Z]*>', '<html>hh</html>')
print(list07)
list08=re.findall("<(\w*)><(\w*)>.*</\2></\1>", "<html><h1>www.itcast.cn</h2></html>")
print(list08)
结果演示:
['8']
['78']
['88']
[]
['100']
['qq']
['<html>hh</html>']
[]
(六)匹配模式参数
1.实例演示
import re
'''
1.匹配模式参数
[
"match", "fullmatch", "search", "sub", "subn", "split",
"findall", "finditer", "compile", "purge", "template", "escape",
"error", "A", "I", "L", "M", "S", "X", "U",
"ASCII", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE",
"UNICODE",
]
'''
s='JavaPHPC#\nPython'
#2.re.I忽略大小写匹配出C#,re.S将\n换行符也匹配出来。
list01=re.findall('c#',s,re.I)
#3.如果不使用re.S无法匹配出字符串
list02=re.findall('c#.{1}',s,re.I)
list03=re.findall('c#.{1}',s,re.I|re.S)
print(list01)
print(list02)
print(list03)
结果演示:
['C#']
[]
['C#\n']
(七)正则表达式替换字符串
1.使用字符串对象的replace()方法替换
test.txt:我禁不住抬起头来,看那天窗外空中的一轮明月,不由得低头沉思,想起远方的家乡。
问题一.把“家乡”替换成“姑凉”
def replace_word(filename,old_str,new_str):
file01=open(filename,encoding='gbk')
s=file01.read()
result=s.find(old_str)
if result!=-1:
line=s.replace(old_str,new_str)
file02=open(filename,'w')
file02.write(line)
print("替换成功!")
else:
print('未找到要替换的字符串')
replace_word('test.txt','姑凉','家乡')
2.正则表达式替换字符串
import re
'''
def sub(pattern, repl, string, count=0, flags=0):
return _compile(pattern, flags).sub(repl, string, count)
'''
'''
方法中的三个重要参数
1.pattern:new_str
1.repl:old_str
2.string:文本内容
3.count关键字参数默认值为0:表示替换所有要替换的字符。
4.count关键字参数默认值为1: 表示替换最先出现的那个字符串。
'''
s='Java_C#_Python_C#'
result01=re.sub('C#','C',s,count=0)
result02=re.sub('C#','C',s,count=1)
print(result01)
print(result02)
结果演示:
Java_C_Python_C
Java_C_Python_C#
(八)search()和match()函数的使用
import re
'''
1.search()和match()函数的使用
'''
s='Hello#world_123'
#1.findall()匹配出所有字符串
result01=re.findall('\w+',s)
print(result01)
#2.在整个字符串中搜索匹配发现匹配后,则返回匹配对象。
match02=re.search('\w+',s)
result02=match02.group()
print(result02)
#3.只从字符串开头开始搜索。
match03=re.match('\w+',s)
result03=match03.group()
print(result03)
结果演示:
['Hello', 'world_123']
Hello
Hello