正則表達式常用示例


import re

"""
   使用match方法進行匹配
   result = re.match(正則表達式,要匹配的字符串)
   如果match匹配到數據的話,就可以使用group方法提取數據

   注: 若字符串匹配正則表達式,則match方法返回匹配對象(Match Object), 否則返回None(不是空字符串)
       match方法是從左到右匹配(因為match的這種特性,所以 ^ 從字符串頭開始匹配 可以不用寫),匹配到不一樣的地方,match方法就結束!

"""

 

 

"""
.   :匹配任意一個字符,\n除外
[]  :匹配[]中列舉的字符
\d  : 數字,即0~9
\D  : 非數字
\s  : 空白字符,包括空格, \n , \t ,\r, 回車換行
\S  :非空白字符
\w  :單詞,(可以看成是校驗python變量名,實際兩者沒有任何關系,a~z , A~Z, 0~9 , _ )
\W  : 非單詞字符
"""

 

In [1]: import re

In [2]: re.match('admin','good.admin')

In [3]: re.match('.+','good.admin')
Out[3]: <re.Match object; span=(0, 10), match='good.admin'>

In [4]: re.match('.','good.admin')
Out[4]: <re.Match object; span=(0, 1), match='g'>

In [5]: re.match('..','good.admin')
Out[5]: <re.Match object; span=(0, 2), match='go'>

In [6]: re.match('.*','good.admin')
Out[6]: <re.Match object; span=(0, 10), match='good.admin'>

 

In [7]: re.match('\w','good')
Out[7]: <re.Match object; span=(0, 1), match='g'>

In [8]: re.match('\w','g1')
Out[8]: <re.Match object; span=(0, 1), match='g'>

In [9]: re.match('\W','g1')

# \w與g匹配,但是\W與1不相匹配,所以最終還是不匹配,返回None In [
10]: re.match('\w\W','g1')
"""

邊界問題

^ : 匹配字符串開頭
$ : 匹配結尾
\b : 匹配單詞邊界
\B : 匹配非單詞邊界

"""

 

 

"""

匹配數量:

    *   : 匹配一個字符出現0次或者無限多次
    +   :匹配一個字符出現1次或者無限多次
    ?  :匹配一個字符出現0次或者1次
    {m} : 匹配一個字符出現m次
    {m,}: 匹配一個字符至少出現m次
    {m,n} : 匹配一個字符出現m到n次


"""

 

"""

邊界問題

^ : 匹配字符串開頭
$ : 匹配結尾
\b : 匹配單詞邊界
\B : 匹配非單詞邊界

"""

 

'''
示例2:匹配手機號
'''

r = re.match('1[35689]\d{9}$','13218545678')
print(r)  # <re.Match object; span=(0, 11), match='13218545678'>

r = re.match('1[35689]\d{9}$','132185456789')
print(r)  #None

r = re.match('1[35689]\d{9}','132185456789')  # 沒有$符,無邊界問題
print(r)  #<re.Match object; span=(0, 11), match='13218545678'>

r = re.match('1[35689]\d{9}','13218545aaaa6789')
print(r)  #None

 

'''
示例3: 匹配單詞邊界

'''

# r:去掉轉義;  ^:字符串開頭, od\b:od是單詞邊界
r = re.match(r'^\w+od\b','good')
print(r) # <re.Match object; span=(0, 4), match='good'>

r = re.match(r'^\w+od\b','gooder')
print(r) #None

r = re.match(r'^\w+\bod\b','good')
print(r) #None

r = re.match(r'^\w+\bod\b','jd od')
print(r) #None, 因為\b只表示單詞邊界,並不表示空格

r = re.match(r'^\w+\s\bod\b','jd od')  # 這里用\s去匹配了jd與od之間的空白字符
print(r) #<re.Match object; span=(0, 5), match='jd od'>


r = re.match(r'^\w+od\B','gooder')
print(r) #<re.Match object; span=(0, 4), match='good'>

r = re.match(r'^\w+od\B','good')
print(r) #None

 

"""
分組:


|      : 表示左右任意一個表達式
(ab)   :  將括號中的字符作為一個分組
\num   : 引用分組num匹配到的字符串
(?P<name>) : 分組起別名
(?P=name)  : 引用別名為name分組匹配到的字符串

"""

 

 

'''示例4 匹配0-100之間的數字'''

r = re.match(r'[1-9]\d?$|0$|100$','100' )
print(r) #<re.Match object; span=(0, 3), match='100'>

# 改進版
r = re.match(r'[1-9]?\d?$|100$','0' )
print(r) #<re.Match object; span=(0, 1), match='0'>

 

'''
示例5: 從字符串中抽取特定的字符 , 如抽取h1標簽之間的字符
'''

s = '<h1>我是中國人</h1>'

r = re.match(r"<h1>(.*)</h1>",s)
print(r.group())  #<h1>我是中國人</h1>
print(r.group(1))  # 我是中國人    , 1 : 表過正則表達式分組第1次出現

s = '<h1>打倒小日本</h1>'
r = re.match(r"<h1>(.*)</h1>",s)
print(r.group())  #<h1>打倒小日本</h1>
print(r.group(1))  # 打倒小日本    , 1 : 表過正則表達式分組第1次出現

s = '<h1>打倒小日本 我是中國人</h1>'
r = re.match(r"<h1>(\D*)\s(\D*)</h1>",s)
print(r.group())  #<h1>打倒小日本 我是中國人</h1>
print(r.group(1))  # 打倒小日本  取第1個分組的值
print(r.group(2))  # 我是中國人  取第2個分組的值
print(r.groups())  # 將所有的分組結果以一個元組的形式打印出來

 

 

'''
示例6: 匹配<html><h1>zhengqinfeng</h1></html>,且,首尾尖括號中的內容相同、內層尖括號中的內容相同
'''

s = '<html><h1>zhengqinfeng</h1></html>'

r = re.match(r'<.+><.+>.+</.+></.+>',s)
print(r)  #<re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'>

# 上面的正則貌似完成了需要,實則不然, 它並不滿足"且"后面的要求,所以正確的正則如下

r= re.match(r'<(.+)><(.+)>.+</\2></\1>',s)  # 正則前面加r,不會進行字符串轉義
print(r) #<re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'>

s = '<html><h1>zhengqinfeng</h2></html>'
r= re.match(r'<(.+)><(.+)>.+</\2></\1>',s)  # 正則前面加r,不會進行字符串轉義
print(r) #None

"""
    使用()時,re會記錄()中的內容,我們可以使用\num來引用
    在上面的示例中, 第一次出現的(.+) re會記錄為num =1 ; 第二次出現的 (.+) re會記錄為num =2
    在后面使用時,可以直接\1, \2來引用值

"""

 

由例5,例6兩示例可知,正則分組用途如下:


1. 從字符串提取出特定的字符

2. 動態引用分組內容進行匹配
'''
示例7: 抽取郵箱賬號

        (163|126|135|qq|gmail)  :表示匹配其中一種
        \.  : 匹配郵箱中的.
        (com|cn|net) : 表示匹配郵箱后綴中的一種
        $ : 表結束 ,也就是說郵箱是以com,cn,或者是net結尾

'''

p = r'(\w+)@(163|126|135|qq|gmail)\.(com|cn|net)$'

r = re.match(p, '132@163.com')
print(r)
print(r.groups())
print(r.group(1))  # 提取郵箱賬號  132

 

 

'''
示例8: 正則分組取名字

'''

s = '<html><h1>zhengqinfeng</h1></html>'
r =  re.match('<(?P<key1>.+)><(?P<key2>.+)>.+</(?P=key2)></(?P=key1)>',s)
print(r)  # <re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'>
print(r.groups())  # ('html', 'h1')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM