程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

py4_簡單接觸 Python 正則表達式

編輯:Python

##################################################

目錄

活動簡介

詳解 字典/列表/元組

最常見的三種數據類型

元組

列表

字典

根據括號判斷數據類型

為什麼必須要加轉義符轉義

簡單接觸 Python 正則表達式

匹配單個字符

符號 ./點 的用法

符號 []/或 的用法

符號 %d/匹配數字 的用法

匹配多個字符

符號 */前一個字符出現至少零次 用法

符號 +/前一個字符出現至少一次 用法

符號 ?/前一個字符必須出現一次或者不出現 用法

符號 m/上一個字符出現了 m 次 用法

匹配開頭結尾

符號 ^/匹配字符串開頭 用法

符號 $/匹配字符串結尾 用法

分組匹配

符號 |/兩項都匹配 用法

符號 ()/括號中是一個分組 用法


##################################################

活動簡介

活動地址:CSDN21天學習挑戰賽

學習的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾;一個人摸索學習很難堅持,想組團高效學習;想寫博客但無從下手,急需寫作干貨注入能量;熱愛寫作,願意讓自己成為更好的人…

歡迎參與CSDN學習挑戰賽,成為更好的自己,請參考活動中各位優質專欄博主的免費高質量專欄資源(這部分優質資源是活動限時免費開放喔~),按照自身的學習領域和學習進度學習並記錄自己的學習過程,或者按照自己的理解發布專欄學習作品!

##################################################

詳解 字典/列表/元組

——————————

最常見的三種數據類型

        Python 主要有三種數據類型 字典、列表、元組

        其分別由如下表示

花括號字典

中括號列表

小括號元組

        示例:

dic = { 'a':12, 'b':34 } /* 字典 */
list = [ 1, 2, 3, 4 ] /* 列表 */
tup = ( 1, 2, 3, 4 ) /* 元組 */

%%%%%

元組

        小括號 () 代表 tuple/元組 數據類型

元組是一種不可變序列

        其創建方法很簡單 大多時候都是用小括號括起來的 示例:

Microsoft Windows [版本 6.3.9600]
(c) 2013 Microsoft Corporation。保留所有權利。
C:\Users\byme>python
Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (
AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> tup = ( 1, 2, 3 ) /* 創建一個元組 */
>>> tup
(1, 2, 3)
>>> type ( tup )
<class 'tuple'>
>>> () /* 空元組 */
()
>>> 55, /* 一個值的元組 */
(55,)
>>> 

%%%%%

列表

        中括號 [] 代表 list/列表 數據類型

列表是一種可變的序列

        其創建方法即簡單又特別:

>>> list ( "Python" )
['P', 'y', 't', 'h', 'o', 'n']
>>> 

%%%%%

字典

        大括號 {} 花括號 代表 dict 字典數據類型

        字典是由鍵對值組組成
冒號分開 鍵 和 值
逗號隔開 組

        示例:

>>> dic = { "崽崽":"女", "仔仔":"男" }
>>> dic
{'仔仔': '男', '崽崽': '女'}
>>> 

%%%%%

根據括號判斷數據類型

        Python 語言最常見的括號有三種 分別是

小括號 ()
中括號 []
大括號也叫做花括號 {}

        其作用也各不相同 分別用來代表不同的 Python 基本內置數據類型

——————————

為什麼必須要加轉義符轉義

        看下面這個例子:

        re.findall()  函數可以遍歷匹配獲取字符串中所有匹配的字符串返回的是一個列表

C:\Users\byme>python
Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (
AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.findall ( r"\.", "\." )
['.']
>>> 

        可以看出加上

\

        這個轉義符號

\.

        才能表示一個點:

.

##################################################

簡單接觸 Python 正則表達式

——————————

匹配單個字符

%%%%%

符號 ./點 的用法

        點表示一個字符 具體演示請看:

C:\Users\byme>python
Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (
AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re /* 導入正則表達式模塊 */
>>>
>>> r = re.match ( "", "崽" ) /* match 方法從開頭掃描 第一個參數是規則 第二個參數是目標文本 */
>>> r.group() /* group 函數表示提取分組截獲的字符 上一條代碼沒有匹配規則所以什麼都沒有提取到 */
''
>>> r = re.match ( ".", "喜歡崽崽" ) /* 匹配規則為 提取第一個字符 */
>>> r.group() /* 查看上一行代碼截取到的字符 */
'喜'
>>> r = re.match ( "喜.崽", "喜歡崽崽" ) /* 提取 '喜' 和 '崽' 之間的那個字符 */
>>> r.group() /* 查看提取結果 */
'喜歡崽'
>>> 

        為什麼一定要用 group 方法

        group() 輸出的其實就是 match

        演示:

>>> r = re.match ( ".", "崽崽崽" )
>>> r.group()
'崽'
>>> r /* 可以看到如下信息 span 表示范圍 match 表示提取到的字符 */
<re.Match object; span=(0, 1), match='崽'>
>>> r = re.match ( "喜.崽", "喜歡崽崽" )
>>> r
<re.Match object; span=(0, 3), match='喜歡崽'>
>>> 

%%%%%

符號 []/或 的用法

        如下:

>>> r = re.match ( "A", "abc" ) /* 匹配條件是大寫 目標文本確是小寫 */
>>> r.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> r = re.match ( "A", "Abc" ) /* 如果條件是大寫字母 則目標也必須是大寫字母 */
>>> r.group()
'A'
>>> r = re.match ( "a", "abc" ) /* 如果條件是小寫 目標也必須是小寫 */
>>> r.group()
'a'
>>> 

        第一個字符是大寫或者小寫都可以:

>>> r = re.match ( "[aA]", "aAbc" )
>>> r.group()
'a'
>>> r = re.match ( "[aA]", "Abc" )
>>> r.group()
'A'
>>> 

        就是判斷第一個字符是不是 [] 中的:

>>> r = re.match ( "[我你]", "我愛你" )
>>> r.group()
'我'
>>> r = re.match ( "[我你]", "你愛我" )
>>> r.group()
'你'
>>> r = re.match ( "[我你]", "她愛他" )
>>> r.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> 

        當然也可以指定范圍 這邊以數字示例 你也可以測試字母 一樣的 只不過分大小寫:

>>> r = re.match ( "一共有[0123456789]個坑隊友", "一共有4個坑隊友" )
>>> r.group()
'一共有4個坑隊友'
>>> r = re.match ( "一共有[0-9]個坑隊友", "一共有4個坑隊友" )
>>> r.group()
'一共有4個坑隊友'
>>> r = re.match ( "一共有[035-9]個坑隊友", "一共有4個坑隊友" ) /* 唯獨匹配不到數字 4 此時 r 為 None */
>>> r.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> 

%%%%%

符號 %d/匹配數字 的用法

        就是匹配數字的:

>>> r = re.match ( "有\d個崽崽", "有1個崽崽!" )
>>> r.group()
'有1個崽崽'
>>> r = re.match ( "有\d個崽崽", "有2個崽崽!" )
>>> r.group()
'有2個崽崽'
>>> 

——————————

匹配多個字符

%%%%%

符號 */前一個字符出現至少零次 用法

        匹配規則為:

        [A-Z] 表示字符串的首字母為大寫

        [a-z] 表示後面的這個字母必須為小寫

        * 表示上一個字母可以出現零次或無數次

>>> r = re.match ( "[A-Z][a-z]*", "G" )
>>> r.group()
'G'
>>> r = re.match ( "[A-Z][a-z]*", "GgFuck" )
>>> r.group()
'Gg'
>>> r = re.match ( "[A-Z][a-z]*", "Ggfuck" )
>>> r.group()
'Ggfuck'
>>> 

%%%%%

符號 +/前一個字符出現至少一次 用法

        根據判斷字符串是否符合

[a-zA-Z_]+[\w]

        規則:

        前一個字母必須是

或小寫的

或大寫的

或者是下劃線

且必須出現至少一次

        test.py code:

        這個腳本就不注釋了 如果你看得懂大概邏輯 你就非常適合寫程序!!!

import re
strS = [ "str1", "_str", "2_str", "__str__" ]
for str in strS:
r = re.match ( "[a-zA-Z_]+[\w]", str )
if r:
print ( "字符串 %s 符合要求!" % r.group () )
else:
print ( "字符串 %s 是非法的.." % str )

        VSCode demo:

Windows PowerShell
版權所有 (C) 2014 Microsoft Corporation。保留所有權利。
PS C:\Users\byme> python -u "e:\PY\test.py"
字符串 str1 符合要求!
字符串 _str 符合要求!
字符串 2_str 是非法的..
字符串 __str__ 符合要求!
PS C:\Users\byme> 

%%%%%

符號 ?/前一個字符必須出現一次或者不出現 用法

        示例 匹配出 0 到 99 之間的數字:

>>> r = re.match ( "[1-9]?[0-9]", "5" )
>>> r.group ()
'5'
>>> r = re.match ( "[1-9]?\d", "52" )
>>> r.group ()
'52'
>>> 

%%%%%

符號 m/上一個字符出現了 m 次 用法

        匹配出前 8 密碼 可以是大小寫英文字母和數字:

>>> r = re.match ( "[a-zA-Z0-9]{8}", "82s4h12452" )
>>> r.group ()
'82s4h124'
>>> 

        匹配出前 6 到 15 位的密碼 可以是大小寫英文字母、數字、下劃線 示例:

>>> r = re.match ( "[a-zA-Z0-9_]{6,15}", "3sa43t65C23656Xp09" )
>>> r.group ()
'3sa43t65C23656X'
>>> 

——————————

匹配開頭結尾

%%%%%

符號 ^/匹配字符串開頭 用法

        匹配以 139 開頭的電話號碼 示例:

>>> r = re.match ( "^139[0-9]{8}", "13968576141" ) /* 開頭必須是 139 後面一個是數字 而 {8} 表示這個數字可以再出現 (8-1) 次 */
>>> r.group ()
'13968576141'
>>> r = re.match ( "^139[0-9]{8}", "15968576141" ) /* 開頭不對就不會截取 */
>>> r.group ()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> 

%%%%%

符號 $/匹配字符串結尾 用法

        匹配輸出 163 的郵箱地址 而且 @ 符號之前有 6 到 15 位

        例如

[email protected]

        test.py code:

import re
email_S = { "[email protected]", "[email protected]", "[email protected]" }
for email in email_S:
r = re.match ( "[\w]{6,15}@163\.com$", email )
if r:
print ( "[%s] 是合法的郵件地址,匹配後的結果為 >>> [%s]" % ( email, r.group() ) )
else:
print ( "[%s] 非法!" % email )

        VSCode demo:

Windows PowerShell
版權所有 (C) 2014 Microsoft Corporation。保留所有權利。
PS C:\Users\byme> python -u "e:\PY\test.py"
[[email protected]] 非法!
[[email protected]] 是合法的郵件地址,匹配後的結果為 >>> [[email protected]]
[[email protected]] 非法!
PS C:\Users\byme> 

——————————

分組匹配

%%%%%

符號 |/兩項都匹配 用法

        匹配出 0~100 之間的數字!

>>> r = re.match ( "[1-9]?\d", "0" )
>>> r.group()
'0'
>>> r = re.match ( "[1-9]?\d", "52" )
>>> r.group()
'52'
>>> r = re.match ( "[1-9]?\d", "02" ) /* 這樣不對啊 */
>>> r.group()
'0'
>>>

         還可以在交互模式中寫腳本:

>>> import re
>>> r = re.match ( "[1-9]?\d$", "02" )
>>> if r: /* 冒號!!! */
... print ( r.group () ) /* 可用 TAB 縮進 */
... else:
... print ( "不在 0~100 之間.." )
...
不在 0~100 之間..
>>> 

        使用 | 符號:

>>> r = re.match ( "[1-9]?\d$|100", "52" )
>>> r.group()
'52'
>>> r = re.match ( "[1-9]?\d$|100", "100" )
>>> r.group()
'100'
>>> 

%%%%%

符號 ()/括號中是一個分組 用法

        示例匹配 163、126、qq 郵箱:

C:\Users\byme>python
Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (
AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>>
>>> r = re.match ( "\w{6,15}@163\.com", "[email protected]" )
>>> r.group ()
'[email protected]'
>>>
>>> r = re.match ( "\w{6,15}@(163|126|qq)\.com", "[email protected]" )
>>> r.group ()
'[email protected]'
>>>
>>> r = re.match ( "\w{6,15}@(163|126|qq)\.com", "[email protected]" )
>>> r.group ()
'[email protected]'
>>>
>>> r = re.match ( "\w{6,15}@163\.com", "[email protected]" )
>>> if r:
... print ( r.group () )
... else:
... print ( "不是如下郵箱 >>> [163|126|qq] ..!" )
...
不是如下郵箱 >>> [163|126|qq] ..!
>>> 

        不是以 4、7 結尾的 11 位手機號碼:

import re
tels = ["13100001234", "18912344321", "10086", "18800007777"]
tels = ["73834629344", "19488342830", "18611", "99999999987"]
for tel in tels:
ret = re.match ( "1\d{9}[0-35-68-9]", tel )
if ret:
print ( ret.group () )
else:
print ( ">>> [%s] 不是想要的手機號" % tel )

        VSCode demo:

Windows PowerShell
版權所有 (C) 2014 Microsoft Corporation。保留所有權利。
PS C:\Users\byme> python -u "e:\PY\test.py"
>>> [73834629344] 不是想要的手機號
19488342830
>>> [18611] 不是想要的手機號
>>> [99999999987] 不是想要的手機號
PS C:\Users\byme> 

        提取區號和電話號碼 示例:

C:\Users\byme>python
Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (
AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>>
>>> r = re.match ( "([^-]*)-(\d+)", "131-12345678" )
>>> r.group ()
'131-12345678'
>>> r.group ( 1 )
'131'
>>> r.group(2)
'12345678'
>>> 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved