当前位置: 首页 > ops >正文

【Python】LEGB作用域 + re模块 + 正则表达式

文章目录

  • 一 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.xdnf.cn/news/15655.html

相关文章:

  • 【PTA数据结构 | C语言版】左堆的合并操作
  • 加速度计和气压计、激光互补滤波融合算法
  • IDEA插件离线安装
  • 反序列化漏洞3-反序列化漏洞讲解演示
  • 5W8-3D牢游戏超级大集合[2012年6月] 地址 + 解压密码
  • 智慧后厨检测算法构建智能厨房防护网
  • 瀚高数据库开启Oracle兼容模块
  • 私有服务器AI智能体搭建配置选择记录
  • 如何更改 SQLserver 数据库存储的位置 想从C盘换到D盘
  • ​​Docker 速通教程
  • 机器人行业10年巨变从协作机器人到具身智能的萌芽、突破和成长——从 Automatic慕尼黑10 年看协作机器人到具身智能的发展
  • 加了pm2
  • (数据结构)线性表(上):SeqList 顺序表
  • vue自定义指令bug
  • Skia 的核心类---深入画布SkCanvas
  • Jfinal+SQLite处理 sqlite数据库执行FIND_IN_SET报错
  • Spring AI:程序调用 AI 大模型
  • Python编程进阶知识之第二课学习网络爬虫(selenium)
  • Java HashMap key为Integer时,遍历是有序还是无序?
  • 信息学奥赛一本通 1575:【例 1】二叉苹果树 | 洛谷 P2015 二叉苹果树
  • 基于LiteNetLib的Server/Client Demo
  • 深入理解 Redis 集群化看门狗机制:原理、实践与风险
  • 当OT遇见IT:Apache IoTDB如何用“时序空间一体化“技术破解工业物联网数据孤岛困局?
  • iOS 文件深度调试实战 查看用户文件 App 沙盒 系统文件与日志全指南
  • iOS WebView 调试实战 全流程排查接口异常 请求丢失与跨域问题
  • 深入理解进程地址空间:虚拟内存与进程独立性
  • 首个直播流扩散(LSD)AI模型:MirageLSD,它可以实时把任意视频流转换成你的自定义服装风格——虚拟换装新体验
  • LVS(Linux Virtual Server)详细笔记(实战篇)
  • 基于ROS2进行相机标定,并通过测试相机到棋盘格之间的距离进行验证
  • SpringSecurity-spring security单点登录