首頁 > 軟體

Python語法學習之正規表示式的量詞彙總

2022-04-18 19:00:34

正規表示式中的符號

符號描述
re1 | re2匹配正規表示式 re1 或者 re2 ;re1 與 re2 代表兩個匹配的字串資訊
^匹配字串起始部分
$匹配字串終止部分(也就是末尾部分)
*匹配0次或者多次前面出現的正規表示式
+匹配1次或者多次前面出現的正規表示式
{N}匹配 N 次前面出現的正規表示式
{M, N}匹配 M - N 次前面出現的正規表示式
[…]匹配來自字元集的任意單一字元
[…x-y…]匹配 x-y 範圍內的任意單一字元
[^…]不匹配此字元集內出現的任何一個字元,包括某一範圍的字元(如果在此字元集中出現)
將特殊字元無效化

通過這樣的描述可能大家很難理解,接下來我們看一些簡單的例子,幫助理解它們的用法。(下文範例順序按照上述表格順序排列)

範例 - 1

程式碼範例如下:

import re


test_data = 'Neo@protonmail.com'

print(re.findall('Neo|proton|com|mail', test_data))

# >>> 執行結果如下:
# >>> ['Neo', 'proton', 'mail', 'com']

PS:| 為 或 的關係,只要存在就能捕獲;匹配到的順序只按照字串的順序返回,而不是按照匹配規則返回。

範例 - 2

程式碼範例如下:

import re


test_data = 'Neo@protonmail.com'

print(re.findall('^Neo', test_data))

# >>> 執行結果如下:
# >>> ['Neo']

print(re.findall('^HanMeiMei', test_data))		# 沒有開頭是 HanMeiMei 的資料
# >>> 執行結果如下:
# >>> []

PS:^ 匹配字串起始部分; 等同於上一章節我們學習的 A

範例 - 3

程式碼範例如下:

import re


test_data = 'Neo@protonmail.com'

print(re.findall('com$', test_data))

# >>> 執行結果如下:
# >>> ['com']

print(re.findall('com.cn$', test_data))		# 沒有結尾是 com.cn 的資料

# >>> 執行結果如下:
# >>> []

PS:$ 匹配字串末尾部分; 等同於上一章節我們學習的 Z

範例 - 4

程式碼範例如下:

import re


test_data = 'Neo@protonmail.com'

print(re.findall('w*', test_data))     # 匹配 0 次 或者 多次 數位或字母,[含空格]((解決上一章節的思考問題

# >>> 執行結果如下:
# >>> ['Neo', '', 'protonmail', '', 'com', '']

PS:匹配 0 次 或者 多次 數位或字母,[含空格]((解決上一章節的思考問題)

範例 - 5

程式碼範例如下:

import re


test_data = 'Neo@protonmail.com'

print(re.findall('w+', test_data))     # 匹配 1 次 或者 多次 數位或字母,[不含空格]

# >>> 執行結果如下:
# >>> ['Neo', 'protonmail', 'com']
  • w+ : 匹配1次或者多次數位或者字母
  • @ 和 . :屬於 0 次 範圍,不會被匹配出來

範例 - 6

程式碼範例如下:

import re


test_data = 'Neo@protonmail.com'

print(re.findall('w{3}', test_data))		# 匹配3次數位或者字母

# >>> 執行結果如下:
# >>> ['Neo', 'pro', 'ton', 'mai', 'com']

print(re.findall('[a-z]{3}', test_data))	# 匹配小寫的 [a-z] 3次

# >>> 執行結果如下:
# >>> ['pro', 'ton', 'mai', 'com']
  • {N}:對於匹配到的資料只獲取 N 個
  • [a-zA-Z0-9]:基本上等同於 w

範例 - 7

程式碼範例如下:

import re


test_data = 'Neo@protonmail.com'

print(re.findall('w{1,5}', test_data))    # 匹配 1 次 到 5次 的數位或字母[這是一個範圍]

# >>> 執行結果如下:
# >>> ['Neo', 'proto', 'nmail', 'com']

print(re.findall('w{1, 5}', test_data)) 

# >>> 執行結果如下:
# >>> []
  • [1,5]:給出匹配到的資料的範圍
  • [1, 5]:需要注意的是 N 和 M 中間的逗號不能有空格,否則會返回的是空列表。

範例 - 8

程式碼範例如下:

import re


test_data = 'Neo@protonmail.com'

print(re.findall('[^Neo]', test_data))      # 這裡的 ^ 不再代表開始的位置,而是不匹配 Neo 此字元集

# >>> 執行結果如下:
# >>> ['@', 'p', 'r', 't', 'n', 'm', 'a', 'i', 'l', '.', 'c', 'm']

PS:[^...] 這裡中括號內的 ^ 不再代表開始的位置,而是過濾掉當前字元集中的字元。

組的概念

符號描述
()在匹配規則中獲取指定的資料

程式碼範例如下:

import re


data = "My name is Neo, I'm 30 year's old."
result = re.search('My name is (.*), I'm (.*) year's old.', data)   # search 函數是一個獲取組的概念

print(result.groups())	

# >>> 執行結果如下:
# >>> ('Neo', '30')

print(result.group(1))	# 獲取 組 的第一個資料
# >>> 執行結果如下:
# >>> Neo

print(result.group(2))	# 獲取 組 的第二個資料

# >>> 執行結果如下:
# >>> 30

利用 search 函陣列的概念,獲取指定字串中指定的資料。

貪婪模式與非貪婪模式

在上文的例子中,我們使用的 '.*' 或者 'w+' 等的這種匹配0次或者多次就是屬於 貪婪模式

而非貪婪模式,就是可以匹配到多個資訊,但是進行了限制,就是非貪婪模式。實現非貪婪模式,通過? 組合程式設計非貪婪模式。

d+? 或者 w*? 等模式

以上就是Python語法學習之正規表示式的量詞彙總的詳細內容,更多關於Python正規表示式量詞的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com