正则表达和面向对象

day16 正则表达和面向对象

from re import fullmatch, findall

1. \b - 检测是否是单词边界

“”"
单词边界: 凡是可以两个单词分开的符号都是单词边界,比如:空白字符、标点符号对应的字符、字符串开头和结尾

注意:检测类符号是在匹配成功的情况下看检测类符号所在的位置是否符合要求。
“”"

re_str = r'abc \b123'
print(fullmatch(re_str, 'abc 123'))

re_str = r'\b\d\d\b'
result = findall(re_str, 'shj23结合实际 45 计时开始67,数据,89.计算机90l 78')
print(result)  #['45', '89', '78']

2. \B - 检测是否不是单词边界

re_str = r'\B\d\d\B'
result = findall(re_str, '99shj23结合实际 45 计时开始67,数据,89.计算机90l 78')
print(result)  #['23', '90']

3.^ - 检测是否是字符串开头

re_str = r'^\d\d'
result = findall(re_str, '99shj23结合实际 45 计时开始67,数据,89.计算机90l 78')
print(result) #['99']

4.$ - 检测是否是字符串结尾

re_str = r'\d\d$'
result = findall(re_str, '99shj23结合实际 45 计时开始67,数据,89.计算机90l 78')
print(result) #['78']

匹配次数

from re import fullmatch, match, search, findall

三个a: ‘aaa’ == ‘a{3}’
三个数字: ‘\d\d\d’ == ‘\d{3}’
2到5个大写字母: ‘[A-Z]{2,5}’

    • 0次或者多次(任意次数)
      “”"
      a* - a出现0次或多次
      \d* - \d出现0次或多次,每次的一个\d可以是任意一个数字
      [abc]* - [abc]出现0次或多次,每次的[abc]都可以在a、b、c中任意选一个
re_str = r'a\d*b'
print(fullmatch(re_str, 'ab'))
print(fullmatch(re_str, 'a4b'))
print(fullmatch(re_str, 'a434510b'))
  1. ± 1次或多次(至少一次
re_str = r'a\d+b'
print(fullmatch(re_str, 'ab'))   # None
print(fullmatch(re_str, 'a4b'))
print(fullmatch(re_str, 'a434510b'))
  1. ? - 0次或1次
re_str = r'[-+]?[1-9]\d'
print(fullmatch(re_str, '+16'))
print(fullmatch(re_str, '-16'))
print(fullmatch(re_str, '16'))
  1. {}

{N} - 匹配N次
{M,N} - 匹配M到N次,M和N都可以取到
{M,} - 匹配至少M次
{,N} - 匹配最多N次
“”

re_str = r'1a{2,5}2'
print(fullmatch(re_str, '1aaaaa2'))

re_str = r'1a{3}2'
print(fullmatch(re_str, '1aaa2'))

5.贪婪和非贪婪

在匹配次数不确定的时候才有贪婪和非贪婪两种模式。
贪婪:在能匹配成功的前提下取匹配次数最多的次数。(默认)
非贪婪:在能匹配成功的前提下去匹配次数最少的次数。(在匹配次数后加?)

re_str = r'a.+?b'
print(fullmatch(re_str, 'a神兽金刚234b密码门b'))

print(match(re_str, 'asjsbhhhb123b脚手架水电费'))    # 3次  7次  11次

import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
}
response = requests.get('https://movie.douban.com/top250?start=0', headers=headers)
content = response.text
result = findall(r'alt="(.+?)"', content)
print(result)

分组和分支

from re import fullmatch

1. 分组 - ()

“”"
用法1: 将正则表达式中的一部分作为一个整体,进行整体相关操作,比如控制次数
用法2: 重复-使用\M来重复前面第M个分组中的内容
用法3: 捕获
“”"

# '22a34a56a43'
re_str = '(\d{2}a){3}\d{2}'
print(fullmatch(re_str, '22a34a56a43'))


# '34abc34'、 '78abc78'、'01abc01'
re_str = r'(\d\d)abc\1'
print(fullmatch(re_str, '12abc12'))
print(fullmatch(re_str, '12abc21'))   # None


re_str = r'(\d{2})=([\u4e00-\u9fa5])=\2=\1'
print(fullmatch(re_str, '12=好=好=12'))


re_str = r'(\d{2})=\1=([\u4e00-\u9fa5])=\2'
print(fullmatch(re_str, '34=34=是=是'))

2.分支 - |

“”"
正则表达式1|正则表达式2 - 先让正则1和字符进行匹配,如果成功就成功,如果失败就和正则2进行匹配,
如果正则2成功结果匹配成功,否则匹配失败。(两个正则中只有一个可以匹配成功结果就成功否则失败)
“”"

# '23abc'、'MKHabc'
re_str = r'\d{2}abc|[A-Z]{3}abc'
print(fullmatch(re_str, '23abc'))

re_str = r'(\d{2}|[A-Z]{3})abc'
print(fullmatch(re_str, '23abc'))

3.转义符号

在本身具备特殊功能或者特殊意义的符号加\,让其功能或者意义消失,表示一个普通符号

# '23.67'、'90.01'
re_str = r'[1-9]\d\.\d{2}'
print(fullmatch(re_str, '19.37'))

# '2+8'
re_str = r'\d\+\d'
print(fullmatch(re_str, '6+7'))

注意:独立具备特殊功能的符号在[]中功能会自动消失,例如: +、*、?、.、(、)等

本身在[]中有特殊意义的就要特别注意: ^、-、[、]

re_str = r'\d[\^\].-]\d'
print(fullmatch(re_str, '6]7'))

re模块

1.compile(正则表达式) - 创建一个正则表达式对象

import re
from re import *

re_obj = compile(r'\d{3}')
result = re_obj.fullmatch('123')
print(result)

fullmatch(r'\d{3}', '123')
print(result)

2.匹配类方法

“”"

  1. fullmatch
    fullmatch(正则表达式, 字符串)
    正则表达式对象.fullmatch(字符串) - 判断整个字符串是符合正则表达式描述的规则,如果不符合返回None,符合返回匹配对象。

2)match
match(正则表达式, 字符串)
正则表达式对象.match(字符串) - 判断字符开头是否符合正则表达式描述的规则,如果不符合返回None,符合返回匹配对象。
“”"

result = match(r'((\d{3})-)([a-z]{2,5})', '829-dhm技术交底㐇shs---23')
print(result)  #<re.Match object; span=(0, 7), match='829-dhm'>
print(result.group(0))   # '829-dhm'
print(result.group(1))   # '829-'
print(result.group(2))   # '829'
print(result.span())    # [0, 7)
print(result.span(3))   # [4, 7)

1)获取匹配结果

对象.group() / 匹配对象.group(0) - 获取整个正则表达式匹配到的结果

匹配对象.group(N) - 获取正则表达式中第N个分组匹配到的结果

print(result.group(0)) # ‘829-dhm’
print(result.group(1)) # ‘829-’
print(result.group(2)) # ‘829’

2)获取匹配结果在原字符中的位置

匹配对象.span()

匹配对象.span(N)

print(result.span()) # [0, 7)
print(result.span(3)) # [4, 7)

3)获取原字符串

匹配对象.string

print(result.string) # ‘829-dhm技术交底㐇shs—23’

  1. 查找类方法方法

“”"
search(正则表达式, 字符串)
正则表达式对象.search(字符串) - 获取字符串中第一个满足正则表达式的子串,如果没有返回None,否则返回匹配对象
“”"
result = search(r’\d{3}’, ‘shhs2728309990数据是992sjsj–sjss数据是099’)
print(result) # <re.Match object; span=(4, 7), match=‘272’>

“”"
findall(正则表达式, 字符串)
正则表达式对象.findall(字符串) - 获取字符串中所有满足正则表达式的子串, 以列表的形式返回,列表中的元素是字符串
“”"

str1 = 'shj24萨克斯38904=-37ml899计算机上3,90m7788'
result = findall(r'\d+', str1)   # ['24', '38904', '37', '899', '3', '90', '7788']
print(result)

result = findall(r'[\u4e00-\u9fa5]\d+', str1)
print(result)    # ['斯38904', '上3']

# 如果正则中有分组,findall只提取匹配结果中分组匹配到的内容
result = findall(r'[\u4e00-\u9fa5](\d+)', str1)
print(result)    # ['38904', '3']

result = findall(r'\d+-[a-z]+', 'hshs899-mn生死狙击2-mkl==-892-ma=计算机')
print(result)   # ['899-mn', '2-mkl', '892-ma']

result = findall(r'\d+-([a-z]+)', 'hshs899-mn生死狙击2-mkl==-892-ma=计算机')
print(result)    # ['mn', 'mkl', 'ma']


result = findall(r'((\d+)-([a-z]+))', 'hshs899-mn生死狙击2-mkl==-892-ma=计算机')
print(result)   # [('899', 'mn'), ('2', 'mkl'), ('892', 'ma')]

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

str1 = 'shj24萨克斯38904=-37ml899计算机上3,90m7788'
result = finditer(r'\d+', str1)
print(list(result))


result = finditer(r'(\d+)-([a-z]+)', 'hshs899-mn生死狙击2-mkl==-892-ma=计算机')
print('整个正则匹配结果:', [x.group() for x in result])

result = finditer(r'(\d+)-([a-z]+)', 'hshs899-mn生死狙击2-mkl==-892-ma=计算机')
print('分组1的匹配结果:', [x.group(1) for x in result])

# 4.切割
"""
split(正则表达式, 字符串)
正则表达式对象.split(字符串)     -  将字符串中所有满足正则表达式的子串作为切割点对字符串进行切割

split(正则表达式, 字符串, 最大切割数)
"""
str1 = '节省时间27计算机上9sjjsn6计算机0292jsjsn就几节课2-==解决'
result = split(r'\d+', str1)
print(result)    # ['节省时间', '计算机上', 'sjjsn', '计算机', 'jsjsn就几节课', '-==解决']

str2 = '失敬失敬,啥的看法和。适得府君书就,随叫随到加分号。是计算机上'
result = split(r'[,。]', str2)
print(result)    # ['失敬失敬', '啥的看法和', '适得府君书就', '随叫随到加分号', '是计算机上']


result = split(r'[,。]', str2, 3)
print(result)

5.替换
“”"
sub(正则表达式, 字符串1, 字符串2)
正则表达式对象.sub(字符串1, 字符串2) - 将字符串2中所有满足正则表达式的子串都替换成字符串1

result = sub(r'\d+', '+', '试试7数据09jsjs8989sj计算机上-=')
print(result)   # 试试+数据+jsjs+sj计算机上-=

result = sub(r'\d', '+', '试试7数据09jsjs8989sj计算机上-=')
print(result)   # 试试+数据++jsjs++++sj计算机上-=

result = sub(r'傻[bB逼]|f\s*u\s*c\s*k', '*', 'f u c k!')
print(result)

result = sub(r'\d', '+', '试试7数据09jsjs8989sj计算机上-=', 3)
print(result)   # 试试+数据++jsjs8989sj计算机上-=

匹配参数

from re import fullmatch, S, I

匹配参数:1.单行匹配、2.忽略大小写

1.单行匹配和多行匹配

“”"
默认是多行匹配。
多行匹配的时候.不能和\n(换行)匹配; 单行匹配的时候.可以和\n匹配
“”"

多行匹配

print(fullmatch(r’a.b’, ‘a\nb’)) # None

单行匹配

S是从re模块中导入的

print(fullmatch(r'a.b', 'a\nb', flags=S))   # <re.Match object; span=(0, 3), match='a\nb'>
print(fullmatch(r'(?s)a.b', 'a\nb'))    # <re.Match object; span=(0, 3), match='a\nb'>

2.忽略大小写

“”"
默认不忽略大小写。
忽略大小写的时候,大写字母可以喝对应的小写字母匹配,小写字母也可以和对应的大写字母匹配

rint(fullmatch(r'[a-z]{3}123', 'hSm123'))    # None
# 忽略大小写
print(fullmatch(r'[a-z]{3}123', 'hSM123', flags=I))    # <re.Match object; span=(0, 6), match='hSM123'>
print(fullmatch(r'(?i)[a-z]{3}123', 'hSM123'))    # <re.Match object; span=(0, 6), match='hSM123'>
# 单行匹配和忽略大小写同时进行
print(fullmatch(r'abc.123', 'ABC\n123', flags=I|S))   # <re.Match object; span=(0, 7), match='ABC\n123'>
print(fullmatch(r'(?si)abc.123', 'ABC\n123'))   # <re.Match object; span=(0, 7), match='ABC\n123'>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值