Python基础之包和模块、正则表达式(十)

系列文章目录

文章目录

  • 系列文章目录
  • 一、包和模块
    • 1.1 模块
      • 1.1.1 基本概念
      • 1.1.2 定义模块
      • 1.1.3 导入模块
      • 1.1.4 常见模块
      • 1.1.5 常见第三方模块
    • 1.2 包
      • 1.2.1 基本概念
      • 1.2.2 导入包和子包
      • 1.2.3 \_\_init\_\_.py
    • 1.3 模块与包的区别
  • 二. 正则表达式
    • 2.1 字符匹配
      • 2.1.1 方法和功能
    • 2.2 特殊字符
    • 2.3 数量控制


一、包和模块

1.1 模块

Module,模块

1.1.1 基本概念

  • 定义:模块是一个Python文件,每个 . p y .py .py 文件就是一个模块。
  • 作用:用于组织代码,避免代码重复,提高复用性。
  • 使用:通过 i m p o r t import import 语句导入模块中的内容。

1.1.2 定义模块

定义一个名为 m a t h _ u t i l s . p y math\_utils.py math_utils.py 的模块:

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

1.1.3 导入模块

  • 语法
  1. import 模块名  [as 模块新名字1]
    

    导入一个模块到当前程序

  2. from 模块名 import 模块属性名 [as 属性新名]
    

    导入一个模块内部的部分属性到当前程序

  3. from 模块名 import *
    

    导入一个模块内部的全部属性到当前程序

1.1.4 常见模块

模块 功能 官方文档
math 数学运算 https://docs.python.org/zh-cn/3.12/library/math.html
os 操作系统接口 https://docs.python.org/zh-cn/3.13/library/os.html
os.path 路径相关 https://docs.python.org/zh-cn/3.13/library/os.path.html
datetime 日期和时间 https://docs.python.org/zh-cn/3.13/library/datetime.html
random 随机数生成 https://docs.python.org/zh-cn/3.13/library/random.html
time 时间 https://docs.python.org/zh-cn/3.13/library/time.html

示例

import math
import random
import time
import os
# 随机数模块
def random_fn():
    # 随机数
    # 设置随机数种子
    # random.seed(42)
    re=random.random()#随机生成[0,1)
    print(re)

    # [-5, 6)  
    re=random.random()*(6-(-5))+(-5)
    print(re)

    re=random.randint(10,20)
    print(re)
    
    arr=[10,203,10,40,43,4,32,41,31,42]
    re=random.choice(arr)
    print(re)

    random.shuffle(arr)
    print(arr)

# math模块 
def math_fn():
    print(math.pi)
    print(math.e)
    print(math.sqrt(2))
    print(math.log(2))
    deg=math.pi/180
    print(math.sin(90*deg))
# time模块
def time_fn():
    t=time.time()#1970-1-1 08:00:00 到 这个代码运行的时候 过了多少秒
    # print(t)
    # for _ in range(10000):
    #     c=100+200
    # time.sleep(2)#让程序暂停5秒钟
    print(time.time()-t)

    print(time.localtime())
    # 获取年份
    print(time.localtime().tm_year)
    print(time.strftime("%Y年%m-%d %H:%M:%S"))
    print(time.strftime("%H点%M分%S秒"))
# os用于操作计算机的一些东西(文件,目录)
def os_fn():
    path=os.getcwd()
    print(f"===={path}===")
    re=os.path.join("./img","1.jpg")#拼接
    re=os.path.join("img","a","1.jpg")
    re=os.path.join(path,"img","1.jpg")
    re=os.path.relpath(re)#转换为相对路径
    print(re)
    # os.mkdir("./img2")#创建文件夹

    re=os.listdir("./img")
    print(re)

    # 思考: os.walk()



if __name__=="__main__":
    random_fn()
    math_fn()
    time_fn()
    os_fn()

1.1.5 常见第三方模块

模块 功能 示例
numpy 数值计算 科学运算、矩阵操作
pandas 数据分析 数据清洗与处理
matplotlib 数据可视化 绘制图表
requests HTTP请求处理 爬取网页内容,调用API
flask Web应用框架 快速搭建Web服务

1.2 包

Package

1.2.1 基本概念

  • 定义

    • 包是包含多个模块的目录。
    • 包的本质是一个包含 _ _ i n i t _ _ . p y \_\_init\_\_.py __init__.py 文件的文件夹。
    • 文件 _ _ i n i t _ _ . p y \_\_init\_\_.py __init__.py 可为空,也可以包含初始化代码。
  • 作用:用于组织模块的集合,形成层次化的结构,便于管理大型项目。

  • 结构

    my_package/
        __init__.py
        module1.py
        module2.py
        subpackage/
            __init__.py
            module3.py
    

1.2.2 导入包和子包

  • 使用import关键字可以导入包和子包,以访问其中的模块和内容。
    # 同模块的导入规则
    import 包名 [as 包别名]
    import  包名.模块名 [as 模块新名]
    import  包名.子包名.模块名 [as 模块新名]
    
    from 包名 import 模块名 [as 模块新名]
    from 包名.子包名 import 模块名 [as 模块新名]
    from 包名.子包名.模块名 import 属性名 [as 属性新名]
    
    # 导入包内的所有子包和模块
    from 包名 import *
    from 包名.模块名 import *

参考案例:

# 导入包中的模块
import matplotlib.pyplot as plt

# 导入子包中的模块
from sklearn.linear_model import LinearRegression

1.2.3 __init__.py

_ _ i n i t _ _ . p y \_\_init\_\_.py __init__.py 用于初始化Python包或模块,作用有:

  1. 标识包目录: 告诉Python解释器当前目录应被视为一个包。
  2. 执行初始化代码: 可以包含任何代码,通常用于包的初始化操作,如变量初始化、导入模块等。这些代码在包被导入时执行。
  3. 控制包的导入行为: 通过 __all__ 变量明确指定从包中可以导入哪些模块,从而限制包的公开接口。
  4. 提供包级别的命名空间: __init__.py 中定义的变量和函数可以在包的模块中共享。
  5. 批量导入模块: 可以在 __init__.py 文件中批量导入模块,这些模块可以更方便地使用。

示例代码:

# __init__.py 文件示例

# 1. 批量导入系统模块
import os
import sys
import datetime

# 2. 定义包级别的变量
package_variable = "This is a package variable"

# 3. 控制包的导入行为
__all__ = ['module1', 'module2']

# 4. 执行初始化代码
print("Initializing mypackage")

# 注意:这个代码会在包被导入时执行

# 5. 导入包内的模块
from . import module1
from . import module2

1.3 模块与包的区别

模块
一个Python文件 一个包含__init__.py的文件夹
提供基本功能单元 用于组织多个模块
文件名为.py 目录名

二. 正则表达式

2.1 字符匹配

正则表达式在网络爬虫、数据分析中有着广泛使用,掌握正则表达式能够达到事半功倍的效果。

2.1.1 方法和功能

方法 功能
match() 判断一个正则表达式是否从开始处匹配一个字符串
search() 遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象
findall() 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回。如果给出的正则表达式中包含子组,就会把子组的内容单独返回,如果有多个子组就会以元组的形式返回。
finditer() 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回

示例1

# 正则表达式模块-regular expression
import re
a = re.findall(r'\d+', 'runoob 123 google 456') # 输出结果:['123', '456'] \d+表示匹配数字,+表示匹配一个或多个数字
print(a)
b = re.findall("xiaoming","xiaoming是我家小明")
print(b)

c = re.match(r'www', 'www akldjlaksjxzlkiii')
print(c) # 
print(c.span()) # 输出结果:(0, 3)

d = re.search(r'w', 'd awdj alkklaslkdiwa')
print(d)

e = re.finditer(r'w', 'd awdj alkklaslkdiwa')
print(e)
for i in e:
    print(i.span())

示例2

# 规则

import re
# 12a3 的子串是"12a3"
a = re.findall("12a3","dawda12a3j lkasjdlk  12a3")
print(a) # ['12a3', '12a3'] 找到几个就打印几个
#[小明] 的子串是"小" "明" 
a = re.findall("[小明]","dawda小明j lkasjdlk  明")
print(a) # ['小', '明', '明']
#[^小明] 的子串 是除"小" "明"外的其他字符
a = re.findall("[^小明]","dawda小明j lkasjdlk  明")
print(a) #['d', 'a', 'w', 'd', 'a', 'j', ' ', 'l', 'k', 'a', 's', 'j', 'd', 'l', 'k', ' ', ' ']
# [a-z] 匹配小写字母  [A-Z] 匹配大写字母 [0-9] 匹配数字
a = re.findall("[a-z]","dawda小明j lkasjdlk  明")
print(a) 
# .小明    . 匹配除换行符之外的任何单个字符
a = re.findall(".小明","dawda小明j lkasjdlk  明")
print(a) #['a小明']
# .+小明   .+ 匹配前面的字符一次或多次
a = re.findall(".+小明","dawda小明j lkasjdlk  明")
print(a) # ['dawda小明']

2.2 特殊字符

特殊字符 含义
\d 匹配任何十进制数字;相当于类 [0-9]
\D 与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9]
\s 匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [ \t\n\r\f\v]
\S 与 \s 相反,匹配任何非空白字符;相当于类 [^ \t\n\r\f\v]
\w 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9_]
\W 于 \w 相反 (注:re.ASCII 标志使得 \w 只能匹配 ASCII 字符)
\b 匹配单词的开始或结束
\B 与 \b 相反

2.3 数量控制

示例

import re

# * 匹配前面的字符0次或多次
arr = re.findall("66*6", "示例文本66666")
print(arr)

# + 匹配前面的字符1次或多次
arr = re.findall("[0-5]+jpg", "示例文本1231622jpg")
print(arr)

# ? 匹配前面的字符0次或1次
arr = re.findall("6?jpg", "示例文本12316226jpg")
print(arr)

# {n} 匹配前面的字符n次
arr = re.findall("6{3}jpg", "示例文本1231622666jpg")
arr = re.findall("哈{3}", "示例文本哈哈哈1231622666jpg")
print(arr)

# {n,} 匹配前面的字符n次或者多次
arr = re.findall("(abc){3,}", "示例文本哈哈abcabcabc哈1231622666jpg")
print(arr)

解释如下图所示

匹配规则 描述 示例文本 输出结果
66*6 匹配前面的字符0次或多次 示例文本66666 [‘66666’]
[0-5]+jpg 匹配前面的字符1次或多次 示例文本1231622jpg [‘1231622jpg’]
6?jpg 匹配前面的字符0次或1次 示例文本12316226jpg [‘6jpg’]
6{3}jpg 匹配前面的字符3次 示例文本1231622666jpg [‘666jpg’]
哈{3} 匹配前面的字符3次 示例文本哈哈哈1231622666jpg [‘哈哈哈’]
(abc){3,} 匹配前面的字符3次或多次 示例文本哈哈abcabcabc哈1231622666jpg [‘abcabcabc’]

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