欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?re模塊的使用全過(guò)程

 更新時(shí)間:2025年04月14日 14:58:02   作者:Yant224  
這篇文章主要介紹了Python?re模塊的使用全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、模塊簡(jiǎn)介

re 模塊是 Python 標(biāo)準(zhǔn)庫(kù)中處理正則表達(dá)式的核心工具,提供強(qiáng)大的文本模式匹配、搜索和替換功能。通過(guò)特定的語(yǔ)法規(guī)則,可以快速完成以下任務(wù):

  • 數(shù)據(jù)驗(yàn)證(郵箱/手機(jī)號(hào)格式校驗(yàn))
  • 文本內(nèi)容提取(日志分析/網(wǎng)頁(yè)爬蟲)
  • 批量文本處理(格式轉(zhuǎn)換/敏感詞過(guò)濾)
  • 復(fù)雜字符串操作(多條件分割/模板替換)

正則表達(dá)式引擎基于 PCRE(Perl Compatible Regular Expressions)實(shí)現(xiàn)

二、核心功能

  • 函數(shù)介紹:
函數(shù)名稱匹配范圍返回類型適用場(chǎng)景性能特點(diǎn)
re.match僅字符串開(kāi)頭Match/None格式校驗(yàn)快速失敗
re.search全局首次匹配Match/None內(nèi)容提取中等性能
re.findall所有非重疊匹配list批量數(shù)據(jù)收集內(nèi)存消耗高
re.finditer所有非重疊匹配iterator大文本處理內(nèi)存友好
re.split分割字符串list復(fù)雜分隔符處理替代str.split
re.compile-Pattern對(duì)象高頻正則表達(dá)式復(fù)用提升30%性能

三. 功能詳解

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

特點(diǎn)

  • 僅匹配字符串開(kāi)頭,如果不是起始位置匹配成功的話,match() 就返回 None。
  • 相當(dāng)于自動(dòng)添加^錨點(diǎn)

參數(shù)說(shuō)明

參數(shù)描述
pattern匹配的正則表達(dá)式
string要匹配的字符串。
flags標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見(jiàn):正則表達(dá)式修飾符 - 可選標(biāo)志

返回值

  • 成功:re.Match對(duì)象,使用 group(num)groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式
  • 失?。?code>None
匹配對(duì)象方法描述
group(num=0)匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號(hào),在這種情況下它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組。
groups()返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號(hào)。
  • 使用案例
# 驗(yàn)證字符串是否以數(shù)字開(kāi)頭,調(diào)用這個(gè)方法等同于 r'^\d+'
# 如果匹配的字符串是c123abc,是匹配不到的
if re.match(r'\d+', '123abc'):
    print("Valid header")
else:
    print("Invalid header")

# 提取開(kāi)頭的版本號(hào)
version = re.match(r'v?(\d+\.\d+)', 'v3.8.1').group(1)  # '3.8'

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

特點(diǎn)

  • 掃描整個(gè)字符串尋找第一個(gè)匹配
  • 支持復(fù)雜定位邏輯

參數(shù)與返回:同re.match

使用案例

# 查找第一個(gè)有效數(shù)字串,只匹配第一個(gè)
text = "Total: 1500 items, price $299"
match = re.search(r'\d+', text)
if match:
    print(f"價(jià)格:{match.group()}")  # 1500

# 帶條件的搜索
pattern = r'(?<=ID:)\s*[A-Z0-9]{8}'  # 查找ID后的8位編碼
id_code = re.search(pattern, "User ID: AB3XK9P2").group()  # AB3XK9P2

3. re.compile(pattern, flags=0)

特點(diǎn)

  • 預(yù)編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式( Pattern )對(duì)象
  • 適合高頻調(diào)用場(chǎng)景

參數(shù)說(shuō)明

  • pattern : 一個(gè)字符串形式的正則表達(dá)式
  • flags 可選,表示匹配模式,比如忽略大小寫,多行模式等,具體參數(shù)為:
    • re.IGNORECASEre.I - 使匹配對(duì)大小寫不敏感
    • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境
    • re.MULTILINEre.M - 多行模式,改變 ^$ 的行為,使它們匹配字符串的每一行的開(kāi)頭和結(jié)尾。
    • re.DOTALLre.S - 使 . 匹配包括換行符在內(nèi)的任意字符。
    • re.ASCII - 使 \w, \W, \b, \B, \d, \D, \s, \S 僅匹配 ASCII 字符。
    • re.VERBOSEre.X - 忽略空格和注釋,可以更清晰地組織復(fù)雜的正則表達(dá)式。

這些標(biāo)志可以單獨(dú)使用,也可以通過(guò)按位或(|)組合使用。例如,re.IGNORECASE | re.MULTILINE 表示同時(shí)啟用忽略大小寫和多行模式。

返回re.Pattern對(duì)象

使用案例

# 預(yù)編譯郵箱驗(yàn)證正則
email_re = re.compile(
    r'''(
        [\w\.-]+          # 用戶名
        @ 
        [\w\.-]+          # 域名
        \.
        [a-zA-Z]{2,4}     # 頂級(jí)域名
    )''', re.VERBOSE)

# 復(fù)用編譯對(duì)象
valid = email_re.match('user@example.com') is not None  # True

案例調(diào)用match匹配成功時(shí)返回一個(gè) Match 對(duì)象,其中:

  • group([group1, …]) 方法用于獲得一個(gè)或多個(gè)分組匹配的字符串,當(dāng)要獲得整個(gè)匹配的子串時(shí),可直接使用 group()group(0);
  • start([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的起始位置(子串第一個(gè)字符的索引),參數(shù)默認(rèn)值為 0;
  • end([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的結(jié)束位置(子串最后一個(gè)字符的索引+1),參數(shù)默認(rèn)值為 0
  • span([group]) 方法返回 (start(group), end(group))。

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

特點(diǎn):在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果有多個(gè)匹配模式,則返回元組列表,如果沒(méi)有找到匹配的,則返回空列表。

^注意: match 和 search 是匹配一次 findall 匹配所有。

參數(shù)說(shuō)明

  • pattern 匹配模式。
  • string 待匹配的字符串。
  • pos 可選參數(shù),指定字符串的起始位置,默認(rèn)為 0。
  • endpos 可選參數(shù),指定字符串的結(jié)束位置,默認(rèn)為字符串的長(zhǎng)度。

返回值

  • 無(wú)分組:匹配字符串列表 [‘a’, ‘b’, …]
  • 有分組:分組元組列表 [(‘a’, ‘1’), …]

使用案例

# 提取所有數(shù)字
numbers = re.findall(r'\d+', 'A1B23C456')
print(numbers)  # ['1','23','456']

# 分組提取日期成分
dates = re.findall(r'(\d{4})-(\d{2})-(\d{2})', '2023-08-01, 2025-03-15')
print(dates)  # [('2023','08','01'), ('2025', '03', '15')]

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

特點(diǎn)

  • 和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回
  • 處理大文本時(shí)內(nèi)存更高效
參數(shù)描述
pattern匹配的正則表達(dá)式
string要匹配的字符串。
flags標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見(jiàn):正則表達(dá)式修飾符 - 可選標(biāo)志
  • 返回值callable_iterator對(duì)象
  • 使用案例
# 處理100MB日志文件
with open('server.log') as f:
    for match in re.finditer(r'$$(ERROR|WARN)$$.*?(req_id=\w+)', f.read()):
        level = match.group(1)
        req_id = match.group(2)
        print(f"{level}報(bào)警:{req_id}")

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

特點(diǎn)

  • split 方法按照能夠匹配的子串將字符串分割后返回列表
  • 保留分割符內(nèi)容(使用分組時(shí))

參數(shù)說(shuō)明

參數(shù)描述
pattern匹配的正則表達(dá)式
string要匹配的字符串。
maxsplit分割次數(shù),maxsplit=1 分割一次,默認(rèn)為 0,不限制次數(shù)。
flags標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見(jiàn):正則表達(dá)式修飾符 - 可選標(biāo)志
  • 使用案例
# 復(fù)雜分隔符分割
text = "apple, banana;cherry|orange"
parts = re.split(r'[,;|]\s*', text)  # ['apple','banana','cherry','orange']

# 帶保留分隔符的分割
re.split(r'([,;])', 'a,b;c')  # ['a', ',', 'b', ';', 'c']

# 控制分割次數(shù)
re.split(r'\d+', 'a1b22c333d', maxsplit=2)  # ['a','b','c333d']

四、綜合應(yīng)用案例

日志分析系統(tǒng)

log_pattern = re.compile(r'''
    (?P<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})  # 時(shí)間
    \s\|\s
    (?P<level>INFO|ERROR|WARN)                      # 日志級(jí)別
    \s\|\s
    (?P<module>\w+)\.py                             # 模塊
    :(?P<line>\d+)                                  # 行號(hào)
    \s-\s
    (?P<msg>.+)                                     # 消息
''', re.VERBOSE)

for log in open('app.log'):
    if (match := log_pattern.search(log)):
        print(f"{match.group('time')} [{match.group('level')}]", 
              f"{match.group('module')}:{match.group('line')}",
              match.group('msg'))

五、正則表達(dá)式修飾符 - 可選標(biāo)志

正則表達(dá)式可以包含一些可選標(biāo)志修飾符來(lái)控制匹配的模式。

以下標(biāo)志可以單獨(dú)使用,也可以通過(guò)按位或(|)組合使用。

例如:re.IGNORECASE | re.MULTILINE 表示同時(shí)啟用忽略大小寫和多行模式。

最佳實(shí)踐建議

  1. ?優(yōu)先使用編譯對(duì)象:當(dāng)正則使用超過(guò)3次時(shí)
  2. ?合理使用分組:避免過(guò)多捕獲組影響性能
  3. ?注意貪婪匹配:非貪婪模式.*?可避免意外匹配
  4. ?處理特殊字符:用re.escape()處理動(dòng)態(tài)輸入
  5. 控制回溯次數(shù):復(fù)雜正則可能引發(fā)性能問(wèn)題

完整API文檔:Python re模塊官方文檔

模塊功能說(shuō)明
用戶管理1. 注冊(cè)登錄2. 權(quán)限控制3. 資料修改
訂單系統(tǒng)
  • 創(chuàng)建訂單
  • 支付處理
  • 物流跟蹤

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python 非極大值抑制(NMS)的四種實(shí)現(xiàn)詳解

    Python 非極大值抑制(NMS)的四種實(shí)現(xiàn)詳解

    本文主要介紹了非極大值抑制(Non-Maximum Suppression,NMS)的四種實(shí)現(xiàn)方式,不同方法對(duì)NMS速度的影響各不相同,感興趣的小伙伴可以了解一下
    2021-11-11
  • 如何通過(guò)python檢查文件是否被占用

    如何通過(guò)python檢查文件是否被占用

    這篇文章主要介紹了如何通過(guò)python檢查文件是否被占用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Sanic框架流式傳輸操作示例

    Sanic框架流式傳輸操作示例

    這篇文章主要介紹了Sanic框架流式傳輸操作,結(jié)合實(shí)例形式分析了Sanic通過(guò)流請(qǐng)求與響應(yīng)傳輸操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • 對(duì)pandas讀取中文unicode的csv和添加行標(biāo)題的方法詳解

    對(duì)pandas讀取中文unicode的csv和添加行標(biāo)題的方法詳解

    今天小編就為大家分享一篇對(duì)pandas讀取中文unicode的csv和添加行標(biāo)題的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python用tkinter實(shí)現(xiàn)一個(gè)gui的翻譯工具

    python用tkinter實(shí)現(xiàn)一個(gè)gui的翻譯工具

    這篇文章主要介紹了python用tkinter實(shí)現(xiàn)一個(gè)gui的翻譯工具,幫助大家更好的理解和使用python,感興趣的朋友可以了解下 +
    2020-10-10
  • Python中閉包與lambda的作用域解析

    Python中閉包與lambda的作用域解析

    這篇文章主要介紹了Python中閉包與lambda的作用域解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python數(shù)據(jù)可視化之matplotlib.pyplot繪圖的基本參數(shù)詳解

    Python數(shù)據(jù)可視化之matplotlib.pyplot繪圖的基本參數(shù)詳解

    matplotlib.pyplot模塊是一個(gè)功能強(qiáng)大的畫圖模塊,可以對(duì)畫圖的多個(gè)參數(shù)進(jìn)行調(diào)整,下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)可視化之matplotlib.pyplot繪圖基本參數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 如何查看Django ORM執(zhí)行的SQL語(yǔ)句的實(shí)現(xiàn)

    如何查看Django ORM執(zhí)行的SQL語(yǔ)句的實(shí)現(xiàn)

    這篇文章主要介紹了如何查看Django ORM執(zhí)行的SQL語(yǔ)句的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python調(diào)用動(dòng)態(tài)鏈接庫(kù)的基本過(guò)程詳解

    python調(diào)用動(dòng)態(tài)鏈接庫(kù)的基本過(guò)程詳解

    這篇文章主要介紹了python調(diào)用動(dòng)態(tài)鏈接庫(kù)的基本過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python零基礎(chǔ)入門學(xué)習(xí)之輸入與輸出

    Python零基礎(chǔ)入門學(xué)習(xí)之輸入與輸出

    在之前的編程中,我們的信息打印,數(shù)據(jù)的展示都是在控制臺(tái)(命令行)直接輸出的,信息都是一次性的沒(méi)有辦法復(fù)用和保存以便下次查看,今天我們將學(xué)習(xí)Python的輸入輸出,解決以上問(wèn)題
    2019-04-04

最新評(píng)論