总结12(正则表达式)
1. os模块
import os
os.mkdir(文件夹路径) - 在指定的位置创建指定文件夹
os.mkdir('files/test')
os.path.exists(文件夹路径/文件路径) - 判断指定文件夹或者文件是否存在
if not os. path. exists( 'files/test' ) :
os. mkdir( 'files/test' )
2.正则的作用
正则表达式是一种可以让复杂的字符串变得简单的工具。
写正则表达式就是用正则符号来描述字符串规则
tel = '23297293329'
result = re. fullmatch( r'1[3-9]\d{9}' , tel)
if result:
print ( '合法' )
else :
print ( '不合法' )
str1 = '睡觉89jss=3.45-换手23=抗生素820=8'
result = re. findall( r'\d+\.?\d*' , str1)
print ( sum ( [ float ( x) for x in result] ) )
3. 正则语法
1. re模块 – 提供了python中所有和正则相关的函数
fullmatch(正则表达式,字符串) – 判断整个字符串是否满足正则表达式所描述的规则
findall(正则表达式,字符串) - 提取字符串中所有满足正则表式的字符串的子串
search (正则表达式,字符串) - 匹配字符串中第一个满足正则表达式的字串
注意: Python中表达式一个正则表达式—般使用r字符串
3.1 . 正则符号
result= fullmatch( r'abc' , 'abc' )
print ( result)
result= fullmatch( r'.ab.' , '+ab+' )
print ( result)
result= fullmatch( r'\d\das' , '67as' )
print ( result)
result= fullmatch( r'q\sqa' , 'q qa' )
print ( result)
result= fullmatch( r'zxc\wada' , 'zxc_ada' )
print ( result)
result= fullmatch( r'abc\Dzx' , 'abcqzx' )
print ( result)
result= fullmatch( r'abc\Szx' , 'abc1zx' )
print ( result)
result= fullmatch( r'abc\Wzx' , 'abc zx' )
print ( result)
3.2 字符集 - 匹配在字符集中的任意一个字符
[abc] - 匹配a或者b或者c
[abc\d] - 匹配a或者b或者c或者任意数字:[abc0123656789]
[1-5] - 匹配字符1到字符5中的任意一个字符
[a-z] - 匹配任意一个小写字母
[A-Z] - 匹配任意一个大写字母
[a-zA-Z] - 匹配任意一个字母
[a-zA-Z\d] - 匹配任意一个字母或者数字
[a-z=%]
[\u4e00-\u9fa5] - 匹配任意一个汉字
result = fullmatch( r'abc[M9你]123' , 'abc你123' )
print ( result)
result = fullmatch( r'abc[M9你\d]123' , 'abc0123' )
print ( result)
result = fullmatch( r'abc[\u4e00-\u9fa5]123' , 'abc和123' )
print ( result)
result= fullmatch( r'abc[^MN]123' , 'abc$123' )
print ( result)
3.3. 匹配次数符号
匹配类符号匹次数
1) * - 任意次数(0次或者1次或者多次)
a* - a出现任意多次
/d* - 任意多个任意数字
[abc]* -
result= fullmatch( r'3x+2' , '3x2' )
print ( result)
result= fullmatch( r'3x?2' , '3x2' )
print ( result)
{ N} - N次
{ M, N} - M到N次
{ M, } - 至少M次
{ , N} - 最多N次
result= fullmatch( r'3{3}x{3}2' , '333xxx2' )
print ( result)
result= fullmatch( r'3x{3,6}2' , '3xxxx2' )
print ( result)
result= fullmatch( r'[+-]?[1-9]\d*' , '-6787' )
print ( result)
3.4 贪婪和非贪婪模式
在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最少的那个次数。(默认是贪婪模式)
贪婪模式:+、?、*、{M,N}、{M,}、{i,N}
非贪婪模式:+?、??、*?、{M,N}?、{M,}?、{,N}?
result = search( r'a.+b' , '收拾收拾收ahkmb收拾b收b3]er2' )
print ( result)
result = search( r'a.+?b' , '收拾收拾收ahkmb收拾b收b3]er2' )
print ( result)
result = search( r'a.+b' , '收拾收拾收ahkmb3]er2' )
print ( result)
result = search( r'a.+?b' , '收拾收拾收ahkmb3]er2' )
print ( result)
3.5 分组 - ()
正则表达式中可以用()将部分内容括起来表示一个整体﹔括号括起来的部分就是一个分组。
a.整体操作的时候需要分组
b.重复匹配 – 正则中可以通过M来重复它前面第M个分组匹配的结果
c. 捕获 - 提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)
result= fullmatch( r'(\d\d[A-Z])+' , '89K10L' )
print ( result)
result= fullmatch( r'(\d\d{3})([a-z]{1})=\1\2{2}' , '2234k=2234kk' )
print ( result)
message = '技术上234,jsskf8992==技术njk==9223-ssjs233结束时间453'
result= findall( r'[\u4e00-\u9fa5](\d+)' , message)
print ( result)
message = "我是小明,今年23岁,身高180厘米,体重70kg"
result= search( r'身高(\d+)厘米,体重(\d+)kg' , message)
print ( result)
print ( result. group( ) )
print ( result. group( 1 ) , result. group( 2 ) )
3.6 分支 - |
正则1|正则2|正则3... - 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配,....
result= fullmatch( r'abc(\d\d|[A-Z]{2})' , 'abc23' )
print ( result)
3.7 转义符号 - 在本身具有特殊功能或者特殊意义的符号前加\,让特殊符号变成普通
result= fullmatch( r'\d\d\.\d\d' , '23.45' )
print ( result)
result = fullmatch( r'\d[+.?*()\]]\d' , '3]4' )
print ( result)
4. re模块相关函数
1)fullmatch(正则, 字符串) - 用整个字符串和正则,匹配成功返回匹配对象,匹配失败返回None
2)findall(正则, 字符串) - 获取字符串中所有满足正则的子串,默认返回一个列表,列表中的元素是所有匹配到的子串(存在自动捕获现象)
3)search(正则, 字符串) - 匹配第一个满足正则的子串,匹配成功返回匹配对象,匹配失败返回None
4)split(正则, 字符串) - 将字符串中所有满足正则的子串作为切割点进行切割
5)split(正则, 字符串, N) - 将字符串中前N个满足正则的子串作为切割点进行切割
6)sub(正则, 字符串1, 字符串2) - 将字符串2中所有满足正则的子串都替换成字符串1
7)sub(正则, 字符串1, 字符串2, N)
8)finditer(正则, 字符串) - 获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象
9)match(正则, 字符串) - 匹配字符串开头
str1 = '技术7晋级赛7jsks7就开始看'
print ( str1. split( '7' , 2 ) )
str1 = '技术22晋级赛709jsks511就开始80看'
print ( split( r'\d+' , str1, 2 ) )
str1 = '技术22晋级赛709jsks511就开始80看'
print ( sub( r'\d' , '+' , str1) )
message = '妈的,SB,都打起来了你还在打野!草!F u c k'
print ( sub( r'(?i)妈的|sb|草|操|艹|f\s*u\s*c\s*k' , '*' , message) )
str1 = '技术22晋级赛709jsks511就开始80看'
result = finditer( r'\d+' , str1)
print ( list ( result) )
print ( fullmatch( r'\d{3}' , '234' ) )
print ( match ( r'\d{3}' , '234卡咖啡' ) )
print ( '--------------------------------华丽的分割线-------------------------------------' )
print ( fullmatch( r'(?i)abc' , 'abc' ) )
print ( fullmatch( r'(?i)abc' , 'Abc' ) )
print ( fullmatch( r'(?i)abc' , 'ABc' ) )
print ( fullmatch( r'(?i)abc' , 'aBc' ) )
4.1 单行匹配:(?s)
多行匹配(默认):. 不能和换行符进行匹配
单行匹配:. 可以和换行符进行匹配
print ( fullmatch( r'abc.123' , 'abc\n123' ) )
print ( fullmatch( r'(?s)abc.123' , 'abc\n123' ) )
msg = """
'name:"jshf2-
2ss技术"'
"""
result = findall( r'(?s)name:"(.+)"' , msg)
print ( result)