day2-正则

day 2-正则

os模块:

os.mkdir(文件夹路径)  - 在指定的位置创建指定文件夹
# os.mkdir('files/test')

# os.path.exists(文件夹路径/文件路径)   -  判断指定文件夹或者文件是否存在
if not os.path.exists('files/test'):
    os.mkdir('files/test')

一、正则的作用

可以让复杂的字符串变得简单的工具

写正则表达式就是用正则符号来描述字符串规则

二、正则语法

1.re模块 - 提供了python中所有和正则相关的函数

fullmatch(正则表达式,字符串) - 判断整个字符串是否满足正则表达式所描述的规则

findall(正则表达式,字符串) - 提取字符串中所有满足正则表达式的字符串

search(正则表达式, 字符串) - 匹配字符串中第一个满足正则表达式的字符

注意:正则表达式----> 一般使用r字符串

第一类符号:匹配类符号

2.正则符号

1)普通符号 - 在正则表达式里表符号本身的符号

result = fullmatch(r'abc', 'abc')
result1 = fullmatch(r'abc', 'hbc')
print(result)
print(result1)   # None

2). - 匹配任意一个字符

result = fullmatch(r'.bc', 'gbc')
result1 = fullmatch(r'.b.', 'hbn')

3)\d - 匹配任意一个数字字符

result = fullmatch(r'ab\dc', 'ab8c')
print(result)

4)\s - 匹配任意一个空白字符

空白字符:空格(’ ‘)、换行(’\n‘)、水平制表符(’\t’)

result = fullmatch(r'ab\sc', 'ab\tc')
result1 = fullmatch(r'ab\sc', 'ab c')

5)\w - 匹配任意一个字母、数字、下划线或者中文

result = fullmatch(r'abc\w123', 'abc和123')
print(result)

6)\D、\S、\W - 分别与小写相反的字符

result = fullmatch(r'ab\Wc', 'ab#c')
print(result)

7)[字符集] - 匹配子字符集中的任意一个字符

result = fullmatch(r'abc[Mo~n789你]123', 'abco123')
print(result)

[abc] - 匹配a或b或c
[abc\d] - 匹配a或b或c或数字
[1-5] - 匹配1-5中的所有字符
[a-z] - 匹配任意一个小写字母
[A-Z] - 匹配任意一个大写字母
[a-zA-Z] - 匹配任意一个字母
[a-zA-Z\d] - 匹配任意一个字母或数字
[\u4e00-\u9fa5] - 匹配任意一中文

result = fullmatch(r'abc[M9你\d]123', 'abc0123')
print(result)

result = fullmatch(r'abc[\u4e00-\u9fa5]123', 'abc和123')
print(result)

8)[字符集] - 匹配不在字符集中的任意一个字符

result = fullmatch(r'abc[^MN]123', 'abc)123')

第二类符号:匹配 次数符号

匹配类符号匹配次数

1) * - 任意次数

a* - a出现任意多次
\d* - 任意多个任意数字
[abc]*

result = fullmatch(f'M[abc]*2', 'Maaaaa2')
print(result)   # a、b、c可以出现任意多次

result = fullmatch(r'M[3-9]*N', 'M3489N')
print(result)

2)+ - 一次或者多次(至少一次)

result = fullmatch(r'1a+2', '1aaa2')
print(result)

3)? - 0次或者1次

result = fullmatch(r'1a?2', '1aa2')
print(result)       # None

4){}

{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次

result = fullmatch('csda{3,8}m', "csdaam")   # None
result1 = fullmatch('csda{3,8}m', "csdaaam")
print(result1)

练习:写一个正则表达式,可以匹配任意一个除了0的整数。

# 合法:233、+234、-7283、100、-2000

# 不合法:0、0002、2.23

# result = fullmatch(r'[+-]?[^0]\d{0,}', '0123456787630')   错!
# [^0]---->除了0之外的其他任何字符都可以

result1 = fullmatch(r'[+-]?[1-9]\d*', '123456787630')
print(result1)

5)贪婪和非贪婪

在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最小的那个次数
贪婪模式:+、?、、{M,N}、{M,}、{,N}
非贪婪模式:+?、??、
?、{M,N}?、{M,}?、{,N}?

# 贪婪和非贪婪对结果有影响
# 'ahkmb'、'ahkmb收拾b'、'ahkmb收拾b收b'
result = search(r'a.+b', '收拾收拾收ahkmb收拾b收b3]er2')
print(result)       # 

result = search(r'a.+?b', '收拾收拾收ahkmb收拾b收b3]er2')
print(result)       # 

# 贪婪和非贪婪对结果无影响
# 'ahkmb'
result = search(r'a.+b', '收拾收拾收ahkmb3]er2')
print(result)       # 

result = search(r'a.+?b', '收拾收拾收ahkmb3]er2')
print(result)       # 

第三类符号:分组和分支

1)分组 -()
正则表达式中可以用()将部分内容阔起来表示一个整体;括号括起来的部分就是一个分组。

a.整体操作的时候需要分组
b.重复匹配 - 正则中可以通过\M来重复它前面第M个分组匹配的结果
c.捕获 - 提取分组匹配到的结果(捕获分为自动捕获和手动捕获)

# ‘23M’、‘45H679’、‘68J90’、‘10U10’
result = fullmatch(r'(\d\d[A-Z])+', '10U10U')    # 重复匹配括号里面的次数
print(result)

# '23M23'、'90K90'、'78N78'、'10U10'
result = fullmatch(r'(\d\d)[A-Z]\1', '90K90')
print(result)

result = fullmatch(r'(\d{3})([a-z]{2})=\2\1{2}', '234km=km234234')   # 第二个分组匹配的结果重复一次,第一个分组匹配的结果重复两次
print(result)

# findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
message = '技术上234,jsskf8992==技术njk==9223-ssjs233结束时间453'
result = findall(r'[\u4e00-\u9fa5](\d+)', message)
print(result)    # ['234', '453']

# 匹配对象.group(N) -   获取匹配结果中指定分组匹配到的内容
# 提取身高
message = '我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\d+)厘米,体重(\d+)kg', message)
print(result)       # 
print(result.group())       # '身高180厘米,体重70kg'
print(result.group(1), result.group(2))      # 180 70
  1. 分支 - |

正则1|正则2|正则3|… - 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配,…

result = fullmatch(r'abc\d\d|abc[A-Z]{2}', 'abc23')
print(result)
result1 = fullmatch(r'abc(\d\d|[A-Z]{2})', 'abcHK')
print(result1)

转义符号

转义符号:在本身具有特殊功能或者特殊意义的符号前加 \ ,让特殊符号变成普通

整数部分和小数部分都是两位数的小数

result = fullmatch(r'\d\d\.\d\d', '23.45')
print(result)
result1 = fullmatch(r'\d\+\d', '2+5')
print(result1)

保留()

result = fullmatch(r'\([a-z]{3}\)', '(sgy)')
print(result)

result1 = fullmatch(r'\d[+]\d', '2+5')
print(result1)

注意:单独存在有特殊意义的符号,在[]中它的功能会自动消失

result = fullmatch(r'\d[+.?*()\]]\d', '3]4')
print(result)

三、re模块

from re import fullmatch, findall, search, split, sub, finditer, match

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))
# ['技术', '晋级赛', 'jsks7就开始看']

str1 = ‘技术22晋级赛709jsks511就开始80看’

print(split(r'\d+', str1, 2))
# ['技术', '晋级赛', 'jsks511就开始80看']

str1 = ‘技术22晋级赛709jsks511就开始80看’

print(sub(r'\d', '+', str1))
# 技术++晋级赛+++jsks+++就开始++看
str1 = '技术22晋级赛709jsks511就开始80看'
result = finditer(r'\d+', str1)
print(list(result))

# [, , , ]

print(fullmatch(r'\d{3}', '234'))
# , '234卡咖啡'))
# 

1)忽略大小写: (?i)

print(fullmatch(r'(?i)abc', 'abc'))
print(fullmatch(r'(?i)abc', 'ABc'))

2)单行匹配:(?s)

多行匹配(默认):. 不能和换行符进行匹配

单行匹配:. 可以和换行符进行匹配

print(fullmatch(r'abc.123', 'abc\n123'))        # None
print(fullmatch(r'(?s)abc.123', 'abc\n123'))    # 
msg = """
'name:"jshf2-
2ss技术"'
"""
result = findall(r'(?s)name:"(.+)"', msg)
print(result)

你可能感兴趣的:(正则表达式,python,开发语言)