目录
- 01、正则表达式
- 1.1、限定匹配数量规则
- 1.2、原生字符串
- 1.3、分组匹配
- 1.4、编译函数compile
- 1.5贪婪模式和非贪婪模式
01、正则表达式
学习正则表达式操作字符串,re模块是用C语言写的没匹配速度非常快,其中compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该对象拥有一系列方法用于正则表大会匹配和替换,re模块也提供了与这下方法功能完全一致的函数,这些函数适用一个模式字符串做为他们的第一个参数
re.macth方法:re.math 尝试从字符串起始位置匹配,返回match对象,,否则返回None,适用group()获取匹配成功的字符串
语法:re.match(pattern,string,flags)
参数描述pattern匹配的正则表达式string要匹配的字符串flags标志位,用于控制正则表达式的匹配方式:如:是否匹配大小写,多行匹配
参数 | 描述 |
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式:如:是否匹配大小写,多行匹配 |
import re
str='Python is the best language in the world'
result= re.match('P',str)
print(type(result))#<class 're.Match'>
print(result.group())
标志位:如果使用多个标志位,使用|分割,如:re.I|re.M
修饰符 | 描述 |
re.I | 适匹配对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^ 和$ |
re.S | 使.匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符,这个标志影响\w,\W ,\b,\B |
re.X | 该标识符通过给予你更灵活的格式以便于你将正则表达式写得更易于理解。 |
import re
strData='Python is the best language in the world\
gslfjgldsjgls'
#result= re.match('p',strData,re.I|re.M)#第三个参数 忽略大小写
#print(type(result))#<class 're.Match'>
#print(result.group())
res=re.match('(.*?)is(.*?)',strData,re.I)
print(res.group(1))
print(res.group(2))
常用匹配规则:
符号 | 匹配规则 |
.(点) | 匹配任意1个字符除了换行符 |
[abc] | 匹配abc中任意一个 |
\d | 匹配一个数字0-9 |
\D | 匹配非数字 |
\s | 匹配空白 即空格 tab键 |
\S | 匹配非空格 |
\w | 匹配单词字符 即a-z A-Z 0-9 _ |
\W | 匹配非单词字符 |
匹配字符数量:
符号 | 匹配规则 |
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少出现m次 |
{m,n} | 匹配前一个字符出现从m次到n次 |
1.1、限定匹配数量规则
import re
# * 匹配前一个字符出现0次或者无限次
res=re.match('[a-z][a-z]*','MyPython',re.I)
print(res.group())
# + 匹配前一个字符1次或者无限次 至少一次
res=re.match('[a-zA-Z]+[\w]*','mynAMEDCeisz848s_')
print(res.group())
# ? 匹配前一个字符0次或者1次
res=re.match('[a-zA-Z]+[\d]?','mkohjhjgu8jg8')
print(res.group())
# {min,max} 匹配前一个从min到max次 min max必须是非负整数
#{count}精确匹配次数 {count,}没有限制
res=re.match('\d{4,}','46145')
if res:
print('匹配成功{}'.format(res.group()))
#匹配邮箱 格式:xxxxxx@163.com
res=re.match('[a-zA-Z0-9]{6,11}@163.com','318129549@163.com')
print(res.group())
1.2、原生字符串
# path="D:\\1_zhao_File\\1_MarkDown\MarkDown学习使用篇"
# print(path )
import re
#原生字符串 r
print(re.match(r'c:\\a.text','c:\\a.text').group())
#匹配开头结尾
#^ 匹配字符串开头
#$ 匹配字符串结尾
# res=re.match('^p.*','python is language')
res=re.match('^p[\w]{5}','python is language')
print(res.group())
res=re.match('[\w]{5,15}@[\w]{2,5}.com$','318129549@qq.com')
print(res.group())
1.3、分组匹配
# | 匹配左右任意一个表达式 从左往右
import re
res=re.match('[\w]*|100','100')
print(res.group())
# (ab)分组匹配 将括号中字符作为一个分组
res=re.match('([0-9]*)-(\d*)','123456-464651561')
print(res.group())
print(res.group(1))
print(res.group(2))
# \num 的使用
# htmlTag='<html><h1>Python核心编程</h1></html>'
# res1=re.match(r'<(.+)>(.+)>(.+)</\2></\1>',htmlTag)
# print(res1.group(1))
# 分组 别名的使用 (?P<名字>)
data='<div><h1>www.baidu.com</h1></div>'
res=re.match(r'<(?P<div>\w*)><(?P<h1>\w*)>(?P<data>.*)</\w*></\w*>',data)
print(res.group())
1.4、编译函数compile
# re.compile 方法
'''
compile将正则表达式模式编译成一个正则表达式对象
reg=re.compile(pattern)
result=reg.match(string)
等效于result=re.match(pattern,string)
使用re.compile和保持所产生的正则表达式对象重用效率更高
'''
import re
#compile 可以把字符串编译成字节码
#优点:在使用正则表达式进行match时,python会将字符串转为正则表达式对象
# 而如果使用compile,只需要转换一次即可,以后在使用模式对象的话无需重复转换
data='1364'
pattern=re.compile('.*')
#使用pattern对象
res=pattern.match(data)
print(res.group())
#re.search方法
#search在全文中匹配一次,匹配到就返回
data='我爱我伟大的祖国,I love China,China is a great country'
rees=re.search('China',data)
print(rees)
print(rees.span())
print(rees.group())
# print(data[21])
#re.findall方法 匹配所有,返回一个列表,
data='华为牛逼是华人的骄傲'
# res =re.findall('华.',data)
# print(res)
pattern=re.compile('华.')
res=pattern.findall(data)
print(res)
# re.sub方法 实现目标搜索和替换
data1='Pythons是很受欢迎的编程语言'
pattern='[a-zA-Z]+' #字符集范围 +代表 前导字符模式出现1从以上
res=re.sub(pattern,'C#',data1)
resn=re.subn(pattern,'C#',data1)
print(res)
print(resn)
#re.subn 完成目标的的搜索和替换 还返回被替换的数量,以元组的形式返回
#re.split 是新分割字符串
data='百度,腾讯,阿里,华为,360,字节跳动'
print(re.split(',',data))
1.5贪婪模式和非贪婪模式
'''
python 中默认是贪婪的,总是贪婪的匹配尽可能多的字符,非贪婪相反,总是尝试匹配尽可能少的字符
在 ” * ? + {m,n}"后面加上 ? 使贪婪变成非贪婪
'''
#贪婪
import re
res=re.match('[\d]{6,9}','111222333')
print(res.group())
#非贪婪
res=re.match('[\d]{6,9}?','111222333')
print(res.group())
content='asdfbsdbdsabsd'
# pattern=re.compile('a.*b')# 贪婪
pattern=re.compile('a.*?b')#非贪婪
res=pattern.search(content)
print(res.group())
#0710-49