iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
佛心分享-IT 人自學之術

Python學習馬拉松:30天挑戰系列 第 12

Day12. 正規表達式Regular Expressions

  • 分享至 

  • xImage
  •  
  • 了解正規表達式(Regular expressions):
    -非常強大但又相當晦澀。
    -一旦理解就會覺得很有趣。
    -正規表達式是一種獨立的語言。
    -一種「標記字符」的語言 - 用字符進行程式設計。
    -這是一種「老派」的語言 - 緊湊。

  • 正規表達式快速指南:
    -^: 匹配行首。也就是說,只有在行開頭出現的字符才會被匹配到。
    -$: 匹配行尾。只有在行結尾出現的字符才會被匹配到。
    -.: 匹配任意單個字符(除了換行符)。
    -\s: 匹配任何空白字符,包括空格、制表符、換行符等。
    -\S: 匹配任何非空白字符。
    -: 匹配前面的字符零次或多次。
    -
    ?: 匹配前面的字符零次或多次,但盡可能少地匹配(非貪婪匹配)。
    -+: 匹配前面的字符一次或多次。
    -+?: 匹配前面的字符一次或多次,但盡可能少地匹配(非貪婪匹配)。
    -[aeiou]: 匹配方括號中列出的字符中的任意一個。在這個例子中,匹配任何一個元音字母。
    -[^XYZ]: 匹配不在方括號中列出的字符。在這個例子中,匹配除了X、Y、Z之外的任何字符。
    -[a-z0-9]: 匹配指定範圍內的字符。在這個例子中,匹配任意一個小寫字母或數字。
    -( ): 用於捕獲匹配的子字符串。括號內的內容將作為一個組,可以被單獨提取出來。
    -英文版:
    https://ithelp.ithome.com.tw/upload/images/20240926/20168364jYS7N2PU1P.png

  • 正規表達式模組:
    -在使用正規表達式之前,必須先使用 import re 將 re 模組導入到你的程式中。
    -re.search() 函數可以檢查一個字串是否符合特定的正規表達式。這有點像是在一個文本中尋找特定的關鍵字。
    -re.findall() 函數可以從一個字串中找出所有符合正規表達式的部分。

  • 萬用字元:
    -「.」(點):這個字元可以匹配任意一個字符。
    -「」(星號):當放在另一個字符或元字符後面時,表示前面的字符或元字符可以重複0次或多次。
    -解釋:
    ◆ 點:舉例來說,如果我們要匹配一個包含三個字母的字串,可以使用 . {3}。這個表達式會匹配任何三個字母的組合,例如 "cat"、"dog"、"123" 等。
    ◆ 星號:這個字元通常和其他的元字符一起使用。例如,a
    表示匹配0個或多個字母 'a'。所以,"a"、"aa"、"aaa"、甚至空字串都可以被匹配。
    -範例:
    ◆ a.b:匹配以 'a' 開頭,以 'b' 結尾的任意字串。
    ◆ \d
    :匹配任意個數字。
    ◆ .@...*:匹配一個粗略的電子郵件地址格式。

-舉例:
(1)
https://ithelp.ithome.com.tw/upload/images/20240926/20168364BCBG58ypeg.png
-圖片說明:
◆ ^X.*: 的意思是:
■ 匹配以字母 X 開頭的一行。
■ X 後面可以是任何字符,數量不限(包括空格)。
■ 最後這行以冒號 : 結束。
◆ 符合的例子:
■ X-Sieve: CMU Sieve 2.3
■ X-DSPAM-Result: Innocent
■ X-DSPAM-Confidence: 0.8475
■ X-Content-Type-Message-Body: text/plain

(2)
https://ithelp.ithome.com.tw/upload/images/20240926/20168364po5ynHWnk5.png
-圖片說明:
◆ ^X-\S+: 的意思是:
■ 匹配以 X- 開頭的一行。
■ X- 後面跟著一連串的非空白字符。
■ 最後是以冒號 : 結束。
◆ 符合的例子:
■ X-Sieve: CMU Sieve 2.3
■ X-DSPAM-Result: Innocent

  • 匹配和提取數據:
    -re.search( ):判斷一個字串是否符合特定的正規表達式,返回 True 或 False。
    -re.findall( ):找出字串中所有符合正規表達式的部分,並將它們以列表的形式返回。
    -舉例:
    https://ithelp.ithome.com.tw/upload/images/20240926/20168364ZC4X5aKJfL.png

-程式碼說明:
◆ 第一行:導入 Python 的正規表達式模組。
◆ 第二行:定義一個包含數字的字串。
◆ 第三行:使用 re.findall() 函數,在字串 x 中查找所有連續的數字(一個或多個),並將找到的數字存儲在列表 y 中。
◆ 第四行:打印列表 y 的內容,即所有找到的數字。
◆ 第五行:輸出。
-正規表達式 [0-9]+:
◆ [0-9]:匹配任意一個數字(0 到 9)。
◆ +:匹配前面的元素(即數字)一次或多次。
◆ 因此,這個正規表達式用於匹配一個或多個連續的數字。

  • 貪婪匹配(Greedy Matching):
    -在正規表達式中,當我們使用重複字符(如 * 或 +)來表示「0 個或多個」或「1 個或多個」時,匹配引擎會盡可能地向後匹配,也就是說,它會試圖匹配儘可能多的字符,直到遇到不符合匹配模式的字符為止。
    -舉例:
    https://ithelp.ithome.com.tw/upload/images/20240926/20168364NUq2a1xqyR.png

-正規表達式 ^F.+:
◆ ^:匹配字串的開頭。
◆ F:匹配字母 F。
◆ .+:匹配任意字符(.)一次或多次(+)。
◆ ::匹配冒號。
-為什麼會匹配到 'From: Using the :' ,而不是 'From:' 呢?
◆ 因為 .+ 是貪婪的,它會一直匹配下去,直到遇到 : 為止。所以,它匹配到了 'From: Using the :' 這整個部分。

  • 非貪婪匹配(Non-Greedy Matching):
    -在重複量詞後面加上 ?,表示盡可能少地匹配字符,直到滿足整個正規表達式為止。
    -貪婪匹配與非貪婪匹配是正規表達式中常見的概念,用來控制重複量詞(如 *、+)的匹配行為。
    -舉例:
    https://ithelp.ithome.com.tw/upload/images/20240926/20168364hLtke236bb.png

-正規表達式^F.+?:
◆ .+?:匹配任意字符(.)一次或多次(+),但盡可能少地匹配(?)。
◆ 由於 .+? 是非貪婪的,因此匹配引擎會在找到第一個 : 時就停止匹配,所以最終匹配結果是 'From:'。

  • 精細調整字串提取:
    -可以透過使用括號來細化 re.findall( ) 函數的匹配,並且分別指定要提取的匹配部分。
    -舉例:
    https://ithelp.ithome.com.tw/upload/images/20240926/20168364c2hZWckfne.png
    -程式碼說明:
    ◆ re.findall():這個函數用於在字串 x 中查找所有符合正規表達式 \S+@\S+ 的部分。
    ◆ \S+@\S+:這個正規表達式用來匹配電子郵件地址。
    ■ \S+:表示匹配一個或多個非空白字符。
    ■ @:匹配字面上的 @ 符号。
    ■ \S+:再次匹配一個或多個非空白字符。

以上圖片皆出自於Coursera上的課程「Python for Everybody」來自University of Michigan。


上一篇
Day11. 元組Tuples
下一篇
Day13. Networks and Sockets
系列文
Python學習馬拉松:30天挑戰16
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言