正则表达式

下载英雄联盟所有英雄的皮肤

import os

import requests


# 1.获取所有英雄的ID
def get_all_hero_id():
    response = requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js')
    result = response.json()
    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}/{skin_name}.jpg', 'wb') as f:
        f.write(response.content)
    print(f'--------------{skin_name}下载完成----------------')


# 2.获取每个英雄的皮肤地址
def get_hero_skin_url(hero_id):
    url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js'
    response = requests.get(url)
    for x in response.json()['skins']:
        hero_name = x['heroTitle']
        skin_name = x['name'].replace('/', '')
        skin_url = x['mainImg'] if x['mainImg'] else x['chromaImg']
        download(hero_name, skin_name, skin_url)


if __name__ == '__main__':
    for x in get_all_hero_id():
        get_hero_skin_url(x)

OS

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

regular

import re
from re import *
# 1.正则的作用
# 正则表达式是一种可以让复杂的字符串变得简单的工具
# 写正则表达式的时候就是用正则符号来描述字符串规则

# 案例:判断输入的电话号码是否合法
tel = '189034430'
result = re.fullmatch(r'1[3-9]\d{9}',tel)
if result:
    print('合法')
else:
    print('不合法')
    
    
# 案例:    
str1 = 'jdxnh24反对腐败w12发到你家3.23'
result = re.findall(r'\d+\.?\d*',str1)
print(sum([float(x) for x in result])) # 39.23

正则语法

import re
from re import fullmatch,findall,search

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

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

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

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

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

2.正则符号

第一类符号:匹配类符号

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

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

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

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

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

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

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

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

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

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

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

1) * - 任意次数(0次或者1次或者次数)

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

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

3)? - 0次或者1次(最多一次)

4){}

{N}  -  N次
{M,N}  -  M到N次
{M,}  -  至少M次
{,N}  -  最多N次  
# 练习:写一个正则表达式,可以匹配任意一个除了0的整数。
# 合法:233、+234、-7283、100、-2000
# 不合法:0、0002、2.23
print(fullmatch(r'[-+]?[1-9]\d*','2.23'))

5)贪婪和非贪婪模式

在匹配次数不确定的时候,如果有多种次数都可以匹配成功(前提条件),贪婪取最多的那个次数,非贪婪取最少的那个次数。(默认是贪婪模式)

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

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

# 练习:获取豆瓣top250详情页
import requests
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
response = requests.get('https://movie.douban.com/top250?start=0&filter=',headers=headers)
# print(response.text)
result = findall(r'<a href=("https://movie.douban.com/subject/\d*?/")>',response.text)
print(result)

第三类符号:分组和分支

1)分组 - ()

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

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

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

c.捕获 - 提取分组匹配到的结果(捕获分为自动捕获(只有findall有)和手动捕获两种)

​ findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容

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

print(fullmatch(r'(\d\d[A-Z])+','23F34H56X78G'))
# print(fullmatch(r'(\d{3})([a-z]{2})=\2\1{2}',))
# findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
# 匹配对象.group(N)  -  获取匹配结果中指定分组匹配到的内容
message = '我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\d+)厘米,体重(\d+)kg',message)
print(result) # <re.Match object; span=(11, 25), match='身高180厘米,体重70kg'>
print(result.group()) # 身高180厘米,体重70kg
print(result.group(1),result.group(2)) # 180 70

2)分支 - |

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

# 'abc12','abcHF','abc34'
result = fullmatch(r'abc\d\d|abc[A-Z]{2}','abcHG')
print(result)
result = fullmatch(r'abc(\d\d|[A-Z]{2})','abc89')
print(result)

转义符号

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

# 匹配整数部分和小数部分都是两位数的小数
result = fullmatch(r'\d\d\.\d\d','34.43')
print(result)

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

re模块

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

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

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

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

4)splite(正则,字符串) - 将字符串中所有满足正则的子串作为切割点进行切割

5)splite(正则,字符串,[N]) - 将字符串中前N个满足正则的子串作为切割点进行切割

6)sub(正则,字符串1,字符串2) - 将字符串2中所有满足正则的子串都替换成字符串1

7)sub(正则,字符串1,字符串2,N)

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

9)match(正则,字符串) - 匹配字符串开头

str1 = '的确很好1我的54吧VG办公房顶上'
result = split(r'\d+',str1)
print(result) # ['的确很好', '我的', '吧VG办公房顶上']


str1 = '得分为此额风格23dvfvfdweqf擦擦234防晒霜双宿双飞'
print(sub(r'\d+','+',str1)) # 得分为此额风格+dvfvfdweqf擦擦+防晒霜双宿双飞


# *,*,都打起来了你还在打野!*!*
message = '妈的,SB,都打起来了你还在打野!草!F u c k'
print(sub(r'(?i)妈的|sb|草|cao|操|艹|f\s*u\s*c\s*k','*',message))

1)忽略大小写:在前面加(?i)

2)单行匹配:(?s)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值