文章目錄
- 一 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() | 從字符串開頭匹配 | Match 或 None |
re.search() | 搜索整個字符串 | Match 或 None |
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 | 匹配字符 a | re.match(r'a', 'apple') → 匹配 'a' |
\\ | 匹配 \ 本身 | re.match(r'\\', '\\') → 匹配 \ |
\n | 換行符 | |
\t | 制表符 |
2. 元字符(特殊字符)
元字符 | 說明 | 示例 |
---|---|---|
. | 匹配任意單個字符(除換行符 \n ) | re.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' |
匹配 URL | r'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 在線工具測試正則表達式!