day2-正则表达式

day2-正则表达式

一、作业:下载英雄皮肤

import requests
import os

# 1.获取所有的英雄ID
def get_all_heroID():
    response = requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js')
    result = response.json()
    # for i in result['hero']:# 每一个i就是一个字典
    #     return i['heroId']
    return [x['heroId'] for x in result['hero']]

# 下载皮肤对应的图片
def download(hero_name, skin_name, skin_url):
    # 创建英雄对应的文件夹
    if not os.path.exists(f'files/{hero_name}'):
        os.mkdir(f'files/{hero_name}')

    # 下载图片
    response = requests.get(skin_url)

    with open(f'files/{hero_name}.jpg','wb') as f:
        f.write(response.content)
    print(f'----------{skin_name}下载完成---------------')

# 2.获取所有的英雄皮肤的地址
def get_all_heroSkins(heroId):
    response = requests.get(f'https://game.gtimg.cn/images/lol/act/img/js/hero/{heroId}.js?ts=2799848')
    result = response.json()
    for i in result['skins']:
        hero_name = i['heroTitle']
        skin_name = i['name'].replace('/', '')
        skin_url = i['mainImg'] if i['mainImg'] else i['chromaImg']
        download(hero_name, skin_name, skin_url)

if __name__ == '__main__':
    for x in get_all_heroID():
        get_all_heroSkins(x)

补充:

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

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

二、正则表达式

  1. 正则的作用

    正则表达式是一种可以让复杂的字符串变得简单的工具

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

import re
from re import *
# 案例1:判断一个字符串是否是一个合法的手机号码
tel = '12345678945'
# 方法1:不用正则表达式
if len(tel) == 11:
    if tel[0] == '1':
        if tel[1] in '3456789':
            if tel[2:].isdigit():
                print('合法')
            else:
                print('不合法')
        else:
            print('不合法')
    else:
        print('不合法')
else:
    print('不合法')

print('--------------------------------华丽的分割线-------------------------------------')



result = re.fullmatch(r'1[3-9]\d{9}', tel)
if result:
    print('合法')
else:
    print('不合法')
# 方法2:用正则表达式

result = re.fullmatch(r'1[3-9]\d{9}',tel)
if result:
    print('合法')
else:
    print('不合法')


# 案例2:提取字符串中所有的数字子串,并且求和
str1 = 'wuin123sbsidbf324'
result = re.findall(r'\d+\.?\d*',str1)
print(sum([float(x) for x in result]))

三、正则语法

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

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

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

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

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

  2. 正则符号

    • 第一类符号:匹配类符号

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

      from re import fullmatch,findall,search,match,finditer,split,sub
      
      result = fullmatch(r'abc', 'abc')
      print(result) #匹配对象规则:<re.Match object; span=(0, 3), match='abc'>
      

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

      from re import fullmatch,findall,search,match,finditer,split,sub
      
      result = fullmatch(r'...bc', '吴小爷bc')
      print(result)
      

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

      from re import fullmatch,findall,search,match,finditer,split,sub
      
      result = fullmatch(r'\d\dabc', '12abc')
      print(result)
      

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

      # 空白字符:空格(' ')、换行('\n')、水平制表符('\t'),如果是tab键,表示有四个空格,需要用四个\s
      result = fullmatch(r'123\sabc','123     ')
      print(result)
      result = fullmatch(r'123\sabc','123\nabc')
      print(result)
      

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

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

      6)\D、\S、\W - 和\d、\s、\w功能相反

      result = fullmatch(r'\D\Dabc', '12abc')
      print(result)
      result = fullmatch(r'123\Sabc','123     ')
      print(result)
      result = fullmatch(r'abc\W123','abc吴123')
      print(result)
      
      1. [字符集] - 匹配在字符集中的任意一个字符
      """
      [abc] - 匹配a或者b或者c
      [abc\d] - 匹配a或者b或者c或者任意一个数字
      [3-9] -  匹配字符3到字符9中的任意一个字符
      [a-z] - 匹配任意一个小写字母
      [a-zA-Z] - 匹配任意一个字母
      [a-zA-Z\d] - 匹配任意一个字母或者数字
      [a-z=%]
      [\u4e00-\u9fa5] - 匹配任意一个中文
      """
      result = fullmatch(r'abc[bjyx]123','abcb123')
      print(result)
      result = fullmatch(r'abc[bjyx=%]123','abc=123')
      print(result)
      

      8)[/^字符集] - 匹配不在字符集中的任意一个字符(没有反斜杠)

      from re import fullmatch,findall,search,match,finditer,split,sub
      
      result = fullmatch(r'abc[^bjyx=%]123','abc4123')
      print(result)
      result = fullmatch(r'abc[^a-z]123','abca123')
      print(result)
      
      result = fullmatch(r'abc[M^N]123', 'abcM123')
      print(result)
      
    • 第二类符号:匹配次数符号

      1)* - 任意次数(0次或者1次或者多次) - 匹配类符号匹配次数

      """
      a* - a出现任意多次
      \d* - 数字出现任意多次
      [abc]* - 
      """
      result = fullmatch(r'1a*2', '12')
      print(result)
      
      result = fullmatch(r'1\d*2', '12')
      print(result)
      
      result = fullmatch(r'1[3-9]*2', '12')
      print(result)
      
          • 一次或者多次(至少1次)
      result = fullmatch(r'1a+2', '1a2')
      print(result)
      
      1. ? - 0次或者1次
      result = fullmatch(r'1a?2', '1aaa2')
      print(result)
      

      4){}

      """
      {N}     -       N次
      {M,N}      -    M到N次
      {M,}    -       至少M次
      {,N}    -       最多N次
      """
      result = fullmatch(r'1a{3}2', '1aaa2')
      print(result)
      
      result = fullmatch(r'1a{3,7}2', '1aaaa2')
      print(result)
      

      5)贪婪和非贪婪模式

      """
      在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最少的那个次数
      贪婪模式(默认):+、?、*、{M,N}、{M,}、{,N}
      非贪婪模式(默认):+?、??、*?、{M,N}?、{M,}?、{,N}?
      
      """
      result = search(r'a.+b','123ankmb阿萨bfwb123')
      print(result)
      result = search(r'a.+?b','123ankmb阿萨bfwb123')
      print(result)
      

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

      # 合法:233、+234、-7283、100、-2000
      # 不合法:0、0002、2.23
      result = fullmatch(r'[+-]?[1-9]\d*','-123000')
      print(result)
      
    • 第三类符号:分组和分支

      1)分组 - ()

      """
      正则表达式中可以用()将部分内容括起来表示一个整体,括号括起来的部分就是一个分组
      a.整体操作时,需要分组
      b.重复匹配 - 正则中可以通过\M来重复它前面第M个分组匹配的结果
      c.捕获 - 提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)
      """
      # a.整体操作时,需要分组
      # ’23M'、'89K10L'、'09H23P90Q33W'
      result = fullmatch(r'(\d\d[A-Z])+','09H23P90Q33W')
      
      print('------------------------------分割线------------------------------')
      result = fullmatch(r'(\d\d[a-z]{3})+','12asd52asd12asd')
      print(result)
      
      # b.重复匹配
      result = fullmatch(r'(\d\d)[A-Z]\1+','23J23')
      print(result)
      
      #'23M23'、'90k90'
      result = fullmatch(r'(\d{3})([a-z]{2})=\2','456as=as')
      print(result)
      
      result = fullmatch(r'[A-Z]{3}(\d{3})=\1','ASD123=123')
      print(result)
      
      #findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
      message = '无序列表123,asf6+5555,挺好的挺好的11222'
      result = findall(r'[\u4e00-\u9fa5](\d+)',message)
      print(result)
      
      # c捕获
      # 手动捕获
      # 匹配对象.group(N) - 获取匹配结果中指定分组匹配到的内容
      # 提取身高和体重
      message = '我是小王,今年23岁,身高183厘米,体重70kg'
      result = search(r'身高(\d+)厘米,体重(\d+)kg',message)
      print(result)
      print(result.group())
      print(result.group(1),result.group(2))
      

      2)分支 - |

      """
      正则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})','abc12')
      print(result)
      
    • 转义符号

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

      练习:匹整数部分和小数部分都是两位数的小数

      result = fullmatch(r'\d\d\.\d\d', '23.45')
      print(result)
      
      result = fullmatch(r'\d\+\d', '34')
      print(result)
      

      分组:

      #'(amd)'
      result = fullmatch(r'\([a-z]{3}\)', '(jsk)')
      print(result)
      
      # 注意:单独存在有特殊意义的符号,在[]中它的功能会自动消失
      result = fullmatch(r'\d[+.?L*()\]]\d*', '3+4')
      print(result)
      

四、demo

import requests
from re import fullmatch,search,findall

headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}
response = requests.get('https://movie.douban.com/top250?start=0&filter=',headers=headers)
result = findall(r'<a href="(.+?)" class=""',response.text)
print(result)

五、re模块

from re import fullmatch, findall, search, match, finditer, split, sub
# 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))

str1 = '技术22晋级赛709jsks511就开始80看'
print(split(r'\d+', str1, 2))

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

message = '妈的,sb,都打起来了你还在打野!草!'
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('--------------------------------华丽的分割线-------------------------------------')
# 1)忽略大小写: (?i)
print(fullmatch(r'(?i)abc', 'abc'))
print(fullmatch(r'(?i)abc', 'Abc'))
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'))    # <re.Match object; span=(0, 7), match='abc\n123'>

msg = """
'name:"jshf2-
2ss技术"'
"""
result = findall(r'(?s)name:"(.+)"', msg)
print(result)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值