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

【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.lryc.cn/news/592068.html

相关文章:

  • uni-app 跳转页面传参
  • SpringCloud相关总结
  • 牛油果果实检测-目标检测数据集(真实环境下)
  • 基于SpringBoot 投票系统 【源码+LW+PPT+部署】
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 基于jieba实现词频统计
  • 在 React 中根据数值动态设置 SVG 线条粗细
  • Hadoop与云原生集成:弹性扩缩容与OSS存储分离架构深度解析
  • VSCode - VSCode 快速跳转标签页
  • 135. Java 泛型 - 无界通配符
  • Android CountDownTimer
  • Ubuntu系统下交叉编译Android的X265库
  • UVC for USBCamera in Android - 篇二
  • 股指期货的杠杆比例一般是多少?
  • 【软件系统架构】系列七:系统性能——路由器性能深入解析
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - jieba库分词简介及使用
  • 短视频矩阵系统哪家好?全面解析与推荐
  • 短视频矩阵系统:从源头到开发的全面解析
  • 【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形
  • Charles 中文版介绍与使用指南 强大抓包工具助力 API 调试与网络优化
  • 网络编程(modbus,3握4挥)
  • 新书推介 | 吉林大学出版教材《汽车智能辅助驾驶系统技术》,国产仿真工具链GCKontrol-GCAir教学应用
  • mybatisdemo(黑马)
  • S7-1200 Profinet 的诊断功能
  • 嵌入式教育的云端革命:零边界实验室如何重塑未来工程师
  • 硬核电子工程:从硅片到系统的全栈实战指南—— 融合电路理论、嵌入式开发与PCB设计的工程艺术
  • 第三章自定义检视面板_创建自定义编辑器类_检测与应用修改(本章进度(2/9))
  • Xilinx Zynq:一款适用于软件定义无线电的现代片上系统
  • 深度学习之----对抗生成网络-pytorch-CycleGAN-and-pix2pix
  • IP协议深入理解
  • RustDesk 自建中继服务器教程(Mac mini)