文章目录

  • 一 LEGB作用域
  • 二 re(Regular Expression)
    • 预览
    • 1. `re.match()` —— 从字符串开头匹配
    • 2. `re.search()` —— 搜索整个字符串
    • 3. `re.findall()` —— 返回所有匹配的字符串列表
    • 4. `re.finditer()` —— 返回所有匹配的迭代器
    • 5. `re.sub()` —— 替换匹配的字符串
    • 6. `re.split()` —— 按正则表达式分割字符串
    • 7. `re.compile()` —— 预编译正则表达式
    • 8. `Match` 对象的常用方法
  • 三 正则表达式
    • 1. 基本字符匹配
    • 2. 元字符(特殊字符)
    • 3. 预定义字符集(转义字符)
    • 4. 贪婪匹配 vs 非贪婪匹配
    • 5. 分组与捕获
    • 6. 零宽断言
    • 7. 常用正则示例

一 LEGB作用域

global关键字:在函数内部修改全局变量时,必须在函数内部定义全局变量(全局声明)。
nonlocal关键字:在内层函数修改外层嵌套函数内的变量时,也要在内层声明


  • L(Local)局部作用域:函数内部
import math
# 判断是否是素数
def is_prime(n):if n <= 1:return Falseif n == 2:# 唯一偶数中的素数return Trueif n % 2 == 0:# 排除所有的偶数return False# 只需判断到 sqrt(n)的奇数因子max_divisor = math.isqrt(n) + 1for i in range(3, max_divisor, 2):if n % i == 0:return Falsereturn True
"""
其中 max_divisor 是局部变量
"""	

  • E(Enclosing)嵌套作用域:嵌套作用域是指在函数内部可以访问外部函数定义的变量。每当创建一个新的函数,就会创建一个新的嵌套作用域
def outer():n = 1# 嵌套函数def inner0():print(f'初始时外层函数变量n={n}')# 嵌套函数    def inner1(): nonlocal n # 声明外部变量n += 1  # 修改外部变量inner0()   print(f"内层函数执行前n={n}")inner1() print(f"内层函数执行后n={n}")outer()
"""
运行结果:
初始时外层函数变量n=1
内层函数执行前n=1
内层函数执行后n=2
"""

  • G(Global)全局作用域:模块(.py文件)内部
import math
# 判断是否是素数
def is_prime(n):pass # 上述代码
nums = [1, 5, 6, 10] # 全局变量
for num in nums:print(f'{num}是素数吗? {is_prime(num)}')"""
运行结果:
1是素数吗? False
5是素数吗? True
6是素数吗? False
10是素数吗? False
"""
  • B(Builtin)内置模块作用域:builtins.py文件
    在这里插入图片描述

二 re(Regular Expression)

Python 的 re 模块提供了正则表达式(Regular Expression)操作,用于字符串的匹配、查找、替换和分割等操作。


预览

方法功能返回值
re.match()从字符串开头匹配MatchNone
re.search()搜索整个字符串MatchNone
re.findall()返回所有匹配的列表list
re.finditer()返回所有匹配的迭代器iterator
re.sub()替换匹配的字符串str
re.split()按正则表达式分割list
re.compile()预编译正则表达式Pattern

1. re.match() —— 从字符串开头匹配

功能
从字符串的起始位置开始匹配正则表达式,如果匹配成功返回 Match 对象,否则返回 None

语法

re.match(pattern, string, flags=0)

参数

  • pattern:正则表达式模式。
  • string:要匹配的字符串。
  • flags:可选标志(如 re.IGNORECASE 忽略大小写)。

示例

import reresult = re.match(r'hello', 'hello world')
print(result.group())  # 输出: 'hello'result = re.match(r'world', 'hello world')
print(result)  # 输出: None(因为 'world' 不在开头)

2. re.search() —— 搜索整个字符串

功能
扫描整个字符串,返回第一个匹配的 Match 对象,如果没有匹配则返回 None

语法

re.search(pattern, string, flags=0)

示例

import reresult = re.search(r'world', 'hello world')
print(result.group())  # 输出: 'world'result = re.search(r'python', 'hello world')
print(result)  # 输出: None

3. re.findall() —— 返回所有匹配的字符串列表

功能
返回字符串中所有匹配的子串组成的列表(不返回 Match 对象)。

语法

re.findall(pattern, string, flags=0)

示例

import reresult = re.findall(r'\d+', 'a1b22c333')
print(result)  # 输出: ['1', '22', '333']

4. re.finditer() —— 返回所有匹配的迭代器

功能
返回一个迭代器,包含所有匹配的 Match 对象(比 findall 更灵活,可以获取匹配的位置)。

语法

re.finditer(pattern, string, flags=0)

示例

import rematches = re.finditer(r'\d+', 'a1b22c333')
for match in matches:print(match.group(), match.span())  # 输出: # '1' (1, 2)# '22' (3, 5)# '333' (6, 9)

5. re.sub() —— 替换匹配的字符串

功能
用指定的字符串替换所有匹配的子串,并返回替换后的字符串。

语法

re.sub(pattern, repl, string, count=0, flags=0)

参数

  • repl:替换的字符串(或函数)。
  • count:最多替换次数(默认 0 表示全部替换)。

示例

import reresult = re.sub(r'\d+', 'X', 'a1b22c333')
print(result)  # 输出: 'aXbXcX'# 使用函数替换
def double_num(match):return str(int(match.group()) * 2)result = re.sub(r'\d+', double_num, 'a1b22c333')
print(result)  # 输出: 'a2b44c666'

6. re.split() —— 按正则表达式分割字符串

功能
用正则表达式匹配的子串作为分隔符,分割字符串并返回列表。

语法

re.split(pattern, string, maxsplit=0, flags=0)

示例

import reresult = re.split(r'\d+', 'a1b22c333d')
print(result)  # 输出: ['a', 'b', 'c', 'd']result = re.split(r'[\s,;]+', 'a,b; c  d')
print(result)  # 输出: ['a', 'b', 'c', 'd']

7. re.compile() —— 预编译正则表达式

功能
将正则表达式编译成一个 Pattern 对象,提高多次匹配的效率。

语法

re.compile(pattern, flags=0)

示例

import repattern = re.compile(r'\d+')  # 预编译
result = pattern.findall('a1b22c333')
print(result)  # 输出: ['1', '22', '333']

8. Match 对象的常用方法

re.match()re.search() 返回 Match 对象,常用方法:

  • group():返回匹配的字符串。
  • start():返回匹配的起始位置。
  • end():返回匹配的结束位置。
  • span():返回 (start, end) 元组。

示例

import rematch = re.search(r'\d+', 'a1b22c333')
print(match.group())  # '1'
print(match.span())   # (1, 2)

三 正则表达式

正则表达式(Regular Expression)是一种强大的文本匹配和处理工具,它使用特定的语法规则来描述字符串的模式。


1. 基本字符匹配

字符说明示例
a匹配字符 are.match(r'a', 'apple') → 匹配 'a'
\\匹配 \ 本身re.match(r'\\', '\\') → 匹配 \
\n换行符
\t制表符

2. 元字符(特殊字符)

元字符说明示例
.匹配任意单个字符(除换行符 \nre.match(r'a.c', 'abc') → 匹配 'abc'
^匹配字符串的开头re.match(r'^a', 'apple') → 匹配 'a'
$匹配字符串的结尾re.search(r'e$', 'apple') → 匹配 'e'
*匹配前一个字符 0 次或多次re.match(r'ab*', 'abbb') → 匹配 'abbb'
+匹配前一个字符 1 次或多次re.match(r'ab+', 'abbb') → 匹配 'abbb'
?匹配前一个字符 0 次或 1 次re.match(r'ab?', 'ab') → 匹配 'ab'
{m}匹配前一个字符 m 次re.match(r'a{2}', 'aa') → 匹配 'aa'
{m,n}匹配前一个字符 m 到 n 次re.match(r'a{2,4}', 'aaa') → 匹配 'aaa'
[...]匹配括号内任意一个字符re.match(r'[abc]', 'b') → 匹配 'b'
[^...]匹配不在括号内的任意字符re.match(r'[^abc]', 'd') → 匹配 'd'
``,匹配左边或右边的模式
()分组,捕获匹配的子串re.match(r'(ab)+', 'abab') → 匹配 'abab'

3. 预定义字符集(转义字符)

字符说明示例
\d匹配数字(等价于 [0-9]re.match(r'\d', '3') → 匹配 '3'
\D匹配非数字(等价于 [^0-9]re.match(r'\D', 'a') → 匹配 'a'
\w匹配单词字符(字母、数字、下划线)re.match(r'\w', 'a') → 匹配 'a'
\W匹配非单词字符re.match(r'\W', '@') → 匹配 '@'
\s匹配空白字符(空格、\t\n等)re.match(r'\s', ' ') → 匹配 ' '
\S匹配非空白字符re.match(r'\S', 'a') → 匹配 'a'

4. 贪婪匹配 vs 非贪婪匹配

  • 贪婪匹配(默认):尽可能匹配最长的字符串。
    re.match(r'a.*b', 'axxxbxxxb')  # 匹配整个 'axxxbxxxb'
    
  • 非贪婪匹配(加 ?):尽可能匹配最短的字符串。
    re.match(r'a.*?b', 'axxxbxxxb')  # 只匹配 'axxxb'
    

5. 分组与捕获

语法说明示例
(pattern)捕获分组re.match(r'(\d+)-(\d+)', '123-456') → 分组 ('123', '456')
(?:pattern)非捕获分组(不保存匹配结果)re.match(r'(?:\d+)-(\d+)', '123-456') → 只捕获 '456'
(?P<name>pattern)命名分组re.match(r'(?P<year>\d{4})', '2023') → 分组名 year

6. 零宽断言

语法说明示例
(?=pattern)正向先行断言(后面必须匹配)re.search(r'a(?=b)', 'ab') → 匹配 'a'(后面是 b
(?!pattern)负向先行断言(后面不能匹配)re.search(r'a(?!b)', 'ac') → 匹配 'a'(后面不是 b
(?<=pattern)正向后行断言(前面必须匹配)re.search(r'(?<=a)b', 'ab') → 匹配 'b'(前面是 a
(?<!pattern)负向后行断言(前面不能匹配)re.search(r'(?<!a)b', 'cb') → 匹配 'b'(前面不是 a

7. 常用正则示例

场景正则表达式示例
匹配邮箱r'[\w.-]+@[\w.-]+\.\w+''user@example.com'
匹配 URLr'https?://[\w.-]+(?:/[\w.-]*)*''https://example.com'
匹配手机号r'1[3-9]\d{9}''13800138000'
匹配日期r'\d{4}-\d{2}-\d{2}''2023-10-01'
提取 HTML 标签内容r'<(\w+)>(.*?)</\1>''<h1>Title</h1>' → 分组 ('h1', 'Title')

推荐使用 Regex101 在线工具测试正则表达式!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915100.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915100.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915100.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE -- 数据操作流

6. 数据操作流在执行文件存储一个对象的时候&#xff0c;如果该对象只有少量属性需要存储&#xff0c;并且这些属性的类型都是基本数据类型&#xff0c;此时则不需要对象序列化技术。使用数据操作流既可以实现。 DataOutputStreamDataInputStream 注意&#xff1a; 读取数据的时…

GI6E 加密GRID電碼通信SHELLCODE載入

GI6E https://github.com/MartinxMax/gi6e 「它似乎能從特製的音訊信號中提取敏感資訊。」 HEX-GRID CODEX&#xff08;簡稱 HGC&#xff09;是一種自定義的 6 位元結構編碼系統&#xff0c;使用三位元的群組識別碼&#xff08;Group Bits&#xff09;加上三位元的索引識別碼…

实习十三——传输层协议

补充子网划分的主要目的就是为了节约IP&#xff0c;降低成本&#xff0c;但是如果划分私有IP网段&#xff0c;则完全没有意义&#xff0c;因为私有IP可重复&#xff0c;不要钱&#xff0c;所以私有IP严禁进行子网掩码划分传输层协议TCP三次握手TCP协议数据格式第一次握手&#…

RPG59.玩家拾取物品三:可拾取物品的提示UI

1。以WarriorWidgetBase作为父类&#xff0c;创建一个子类的userwidget2.布局为两个值都为1203。然后我们需要想办法&#xff0c;在合适的位置&#xff0c;用bool来控制此控件的显示与隐藏。情况为&#xff1a;当玩家触发与可拾取物体的重叠时&#xff0c;我们将广播一个bool值…

Vue.js 国际化 (i18n) 实践:让你的应用走向全球,多语言支持如此简单!

文章目录一、为何你的 Vue.js 应用需要“说多种语言”&#xff1f;国际化的重要性二、Vue I18n 基础实践&#xff1a;从零开始搭建多语言环境2.1 安装 Vue I18n2.2 配置 Vue I18n 实例2.3 在组件中使用翻译三、进阶实践&#xff1a;让国际化更强大、更灵活3.1 动态语言切换3.2 …

在CentOS7.9服务器上安装.NET 8.0 SDK

在 CentOS 7.9 系统上手动安装 .NET 8.0 SDK&#xff08;使用本地的 dotnet-sdk-8.0.101-linux-x64.tar.gz 文件&#xff09;&#xff0c;可以按照以下步骤进行操作。由于 CentOS 7.9 已不再被微软官方支持&#xff0c;可能会遇到依赖库版本问题&#xff08;如 GLIBCXX 和 GLIB…

HarmonyOS-ArkUI Web控件基础铺垫4--TCP协议- 断联-四次挥手解析

HarmonyOS-ArkUI&#xff1a; Web组件加载流程1 HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容 HarmonyOS-ArkUI Web控件基础铺垫2-DNS解析 HarmonyOS-ArkUI Web控件基础铺垫3--TCP协议- 从规则本质到三次握手-CSDN博客 接上文&#xff0c;上文我们讲解了: 数据在…

如何用AI 生成论文/书籍的摘要

不知道大家是否有这样的感觉&#xff0c;上网浏览信息&#xff0c;看到好的文章就兴奋地下载了下来&#xff0c;文件的名称通常是一串奇奇怪怪的字符串。过了几天就在电脑中找不着了。没有网络上搜索不到的文章&#xff0c;而是在你的电脑中却找不到它们。几年下来&#xff0c;…

ubuntu系统+N卡 | docker compose+ollama+dify(dify和ollama在同一容器)

1、安装NVIDIA驱动 2、安装docker&#xff0c;docker compose 3、安装NVIDIA Container Toolkit Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit&#xff08;仅 GPU 场景需要&#xff09; # Configure the production repository: curl -fsSL https://…

实习手记:基于大模型的搜索引擎开发实践

初入团队&#xff1a;从理论到实践的跨越五月份开始&#xff0c;我怀着忐忑又期待的心情以线上的方式加入了公司AI研发中心的搜索引擎优化小组。作为一名数据科学与大数据技术专业的学生&#xff0c;这是我第一次参与工业级AI项目的开发&#xff0c;团队的任务是构建一个基于大…

用Python实现神经网络(二)

#Overfitting是机器学习的主要问题。下面我们来看一下过拟合现像&#xff1a;import numpy as npimport matplotlib.pyplot as pltimport matplotlib as mplimport tensorflow as tffrom scipy.optimize import curve_fit# Generic matplotlib parameters for plots and figure…

数据结构入门 (二):挣脱连续空间的束缚 —— 单向链表详解

TOC(目录) 引言&#xff1a;整齐的代价 在上一篇文章中&#xff0c;我们一起探索了数据结构大家族的第一位成员——顺序表。我们了解到&#xff0c;顺序表作为一种线性结构&#xff0c;其最大的特点在于逻辑顺序与物理顺序的一致性&#xff0c;即元素之间不仅存在逻辑上的前后关…

AI-视频一致性与多帧控制在AIGC中的技术挑战与突破!

全文目录&#xff1a;开篇语前言1. 视频中人物一致性建模的难点与现有解决方案**人物一致性建模的挑战****现有解决方案****案例代码&#xff1a;基于姿态估计的多帧一致性保持**2. 光照/纹理/姿态跨帧保持方法剖析**跨帧光照与纹理一致性****跨帧姿态一致性**3. 帧间插值与关键…

基于Qwen2.5-3B-Instruct的LoRA微调与推理实战指南

前言 大语言模型(LLM)的微调是当前AI领域的热门话题&#xff0c;而参数高效微调方法(如LoRA)因其低成本和高效率备受关注。本文将手把手教你如何使用Qwen2.5-3B-Instruct模型进行LoRA微调&#xff0c;并构建完整的推理流程。 一、环境准备 1.1 硬件要求 • GPU: 至少16GB显存(如…

电脑插上u盘不显示怎么回事

对于经常使用电脑的用户来说&#xff0c;U盘是一种再熟悉不过的存储工具。不管是拷贝资料、备份文件&#xff0c;还是制作启动盘&#xff0c;U盘都发挥着重要作用。然而&#xff0c;有时候你可能会遇到这样的情况&#xff1a;“U盘插上电脑&#xff0c;灯亮了&#xff0c;但电脑…

2025年6月GESP(C++二级): 幂和数

2025年6月GESP(C++二级): 幂和数 题目描述 对于正整数 n n n,如果 n n n 可以表为两个

Windows、macOS、liunx下使用qemu搭建riscv64/linux

背景 在Windows、macOS和Linux环境下使用QEMU搭建RISC-V 64位Linux系统&#xff0c;网络上存在大量过时、不完整或错误的教程。且部分AI生成的内容“幻觉”现象严重&#xff0c;导致关键步骤错误且难以进行。为确保可靠性&#xff0c;本教程基于最新实测验证&#xff0c;涵盖三…

简单使用MCP

1、说明# 测试环境服务器 CPU数量&#xff1a;2核 内存&#xff1a;4GB 磁盘&#xff1a;50GB# 补充 如果不想使用Docker进行操作&#xff0c;只需要跳过Docker相关命令操作 即&#xff1a;使用Ollama运行模型&#xff0c;使用Python来创建MCP2、安装Docker# 安装Docker https:…

电脑装机软件一键安装管理器

软件使用 现在的装机软件很多&#xff0c;主要几种类型就是办公、看图、影音、下载等&#xff0c;如果每次装机之后&#xff0c;手动一个一个去安装&#xff0c;费时费力还容易安装到全家桶。 就有人整理了网络上常用的一系列装机软件纯净和谐版本&#xff0c;并打包到一起&a…

深度学习入门-深度学习简介

深度学习是加深了层的深度神经网络。只需通过叠加层&#xff0c;就可以创建深度网络。1、 加深网络将深度学习中的重要技术&#xff08;构成神经网络的各种层、学习时的有效技巧、对图像特别有效的CNN、参数的最优化方法等&#xff09;汇总起来&#xff0c;创建一个深度网络&am…