【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.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…