day17-正则表达式

1. re模块

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

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

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

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

注意:python中表达一个正则表达式一般使用r字符串

2. 正则符号

第一类符号:匹配符号

  1. 普通字符 - 在正则表达式中表示符号本身的符号
result = fullmatch(r'abc', 'xbc')
print(result)       # None
  1. . - 匹配任意一个字符
result = fullmatch(r'.bc', 'xbc')
print(result)       # 

result = fullmatch(r'.bc.', 'abcd')
print(result)       # 
  1. \d - 匹配任意一个数字字符
result = fullmatch(r'\d\dabc', '68abc')
print(result)       # 
  1. \s - 匹配任意一个空白字符

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

result = fullmatch(r'123\sabc', '123\tabc')
print(result)       # 

result = fullmatch(r'\d\d\s\d', '89 2')
print(result)       # 
  1. \w - 匹配任意一个字母、数字、下划线或者中文
result = fullmatch(r'abc\w123', 'abcZ123')
print(result)       # 
  1. \D、\S、\W - 分别和\d、\s、\w的功能相反
result = fullmatch(r'abc\D123', 'abc-123')
print(result)       # 
  1. [字符集] - 匹配字符集中的任意一个字符
'''
[abc] - 匹配a或者b或者c
[abc\d] - 匹配a或者b或者c或者任意一个数字:[abc0123456789]
[1-5] - 匹配字符1到字符5中的任意一个字符
[a-z] - 匹配任意一个小写字母
[A-Z] - 匹配任意一个大写字母
[a-zA-Z\d] - 匹配任意一个字母或者数字
[\u4e00-\u9fa5] - 匹配任意一个中文
'''

result = fullmatch(r'abc[M9你]123', 'abc你123')
print(result)       # 
  1. [^字符集] - 匹配不在字符集中的任意一个字符
result = fullmatch(r'abc[^a-z]123', 'abc你123')
print(result)       # 

result = fullmatch(r'abc[M^N]123', 'abcM123')
print(result)       # 

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

匹配类符号匹配次数

  1. * - 任意次数(0次或者1次或者多次)
a* - a出现任意多次
\d* - 任意多个任意数字
[abc]* - a、b、c出现任意多次
'''
result = fullmatch(r'1a*2', '1aaaaaaaaaaaa2')
print(result)       # 

result = fullmatch(r'M\d*N', 'M84616516N')
print(result)       # 

result = fullmatch(r'M[3-9]*N', 'M65658N')
print(result)       # 
  1. + - 一次或者多次(至少一次)
result = fullmatch(r'1a+2', '1a2')
print(result)       # 
  1. ? - 0次或者1次
result = fullmatch(r'1a?2', '12')
print(result)       # 
  1. {}
'''
{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次
'''
result = fullmatch(r'1a{3,6}2', '1aaaa2')
print(result)       # 
# 练习:写一个正则表达式,可以匹配任意一个除了0的整数。
# 合法:233、+234、-7283、100、-2000
# 不合法:0、0002、2.23
result = fullmatch(r'[+-]?[1-9]\d*', '12.33')
print(result)       # None
  1. 贪婪和非贪婪模式

​ 在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最 少的那个次数

​ 贪婪模式:+、?、*、{M,N}、{M,}、{,N}

​ 非贪婪模式:+?、??、*?、{M,N}?、{M,}?、{,N}?

result = search(r'a.+b', '一体化sg发顺丰15ahkmbxyb很多人b56rdg')
print(result)       # 

result = search(r'a.+?b', '一体化sg发顺丰15ahkmbxyb很多人b56rdg')
print(result)       # 

第三类符号:分组和分支

  1. 分组 - ()

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

​ a. 整体操作的时候需要分组

​ b. 重复匹配 - 正则中可以通过\M来重复它前面第M个分组匹配的结果

​ c. 捕获 - 提取分匹配到的结果(捕获分为自动捕获(findall)和手动捕获)

# '23M', '89k10l', '09R56S55G22G'
result = fullmatch(r'(\d\d[A-Z])+', '09R56S55G22G')
print(result)       # 

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

result = fullmatch(r'(\d\d)[A-Z]\1', '23M24')
print(result)       # None

result = fullmatch(r'(\d{3})([a-z]{2})=\2\1{2}', '234km=km234234')
print(result)

# findall在正则表达式中有分组的时候,会自动提取匹配结果中分组匹配到内容
message = '的色佛52651,snf4684896-9+++-fsf--51额粉色651'
result = findall(r'[\u4e00-\u9fa5](\d+)', message)
print(result)

​ 匹配对象.group() - 获取匹配结果中指定分组分配到的内容

​ 匹配对象.group(N) - 获取匹配结果第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'\d{3}|[a-z]{2}', 'mn')
print(result)       # 

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

第四类符号:转义符号

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

# 匹配整数部分和小数部分都是两位数的小数
result = fullmatch(r'[1-9]\d\.\d\d', '12.34')
print(result)       # 

result = fullmatch(r'\d\+\d', '1+2')
print(result)       # 

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

# 注意:单独存在有特殊意义的符号,在[]这它的功能会消失
result = fullmatch(r'[1-9]\d[+.?*()\]]\d\d', '12.34')
print(result)       # 

3. re模块

  1. fullmatch(正则, 字符串) - 用整个字符串和正则匹配,匹配成功返回匹配对象,匹配失败返回None

  2. findall(正则, 字符串) - 获取字符串所有满足正则的子串,默认返回一个列表,列表,中的元素是所有匹配到的子串(存在自动捕获现象)

  3. search(正则, 字符串) - 匹配第一个满足正则的子串,匹配成功返回匹配对象,匹配失败返回None

  4. split(正则, 字符串, [N]) - 将字符串中所有满足正则的子串作为切割点进行切割,N为最大切割次数

  5. sub(正则 ,字符串1, 字符串2, [N]) - 将字符串2中所有满足正则的子串都替换成字符串1,N为最大替换次数

  6. finditer(正则, 字符串) - 获取所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象

  7. match(正则, 字符串) - 匹配字符串的开头

str1 = '国外113上高速高5gsg5+6该事故1265gseg'
str2 = split(r'\d+', str1)
print(str2)     # ['国外', '上高速高', 'gsg', '+', '该事故', 'gseg']

str2 = split(r'\d+', str1, 2)
print(str2)     # ['国外', '上高速高', 'gsg5+6该事故1265gseg']

str2 = sub(r'\d+', '+', str1)
print(str2)     # 国外+上高速高+gsg+++该事故+gseg

str2 = finditer(r'\d+', str1)
print(list(str2))

result = match(r'\d{3}', '234gsgrytgr')
print(result)       # 
  1. 忽略大小写:(?i)
result = (r'(?i)abc', 'AbC')
print(result)       # 
  1. 单行匹配:(?s)

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

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

result = fullmatch(r'abc.123', 'abc\n123')
print(result)       # None

result = fullmatch(r'(?s)abc.123', 'abc\n123')
print(result)       # 

你可能感兴趣的:(学习,python)