正則表達式

正則表達式

概念:又稱規則表達式,常用來描述、匹配、替換符合某個句法規則的字符串。

理解:特殊字符———>規則———->過濾字符串

目的:1.匹配給定的字符串,2.從字符串中過濾出我們需要的特定部分

Python re模塊

re模塊是python獨有的匹配字符串的模塊,該模塊中提供的很多功能是基於正則表達式實現的,而正則表達式是對字符串進行模糊匹配,提取自己需要的字符串部分,他對所有的語言都通用。

  • re模塊是python獨有的
  • 正則表達式所有編程語言都可以使用
  • re模塊、正則表達式是對字符串進行操作

注意點:正則表達式會對特殊字符進行轉義,如果要保持原模樣,只需加個r前綴。例如:r'\thello-\rworld'

禁止轉義!反斜杠不會被任何特殊方式處理。
Python編譯器用『\』(反斜杠)來表示字符串常量中的轉義字符。
如果反斜杠後面跟着一串編譯器能夠識別的特殊字符,那麼整個轉義序列將被替換成對應的特殊字符(例如,『\n』將被編譯器替換成換行符)
本質上來講,使用r,你在告訴編譯器完全不要去干涉你的字符串
常見轉義符

元字符

元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位於元字符前面的字符)在目標對象中的出現模式。

字符 說明
. 匹配除換行符以外的所有字符
[…] 匹配字符集
\w 匹配字母、數字及下劃線_,等價於[A-Za-z0-9_]
\W 匹配所有與\w不匹配的字符(取反)
\s 匹配單個空格符、包括tab鍵和換行符
\S 匹配除單個空格之外的字符
\d 匹配從0到9的數字,等價於[0-9]
\D 匹配非數字
^ 匹配輸入字符串開始的位置
$ 匹配輸入字符串結尾的位置

限定符(重複)

限定符用來限定一個目標子表達式要重複出現多少次才匹配成功

限定符 說明
* 匹配前面的字符0次或多次
+ 匹配前面的字符1次或多次
匹配前面的字符0次或1次
{n} 匹配前面的字符n次
{n,} 匹配前面的字符至少n次
{n,m} 匹配前面的字符至少n次,最多m次

字符串轉義:\

www.baidu.com

www\.baodu\.com

貪婪與非貪婪

貪婪匹配:正則表達式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。

非貪婪匹配:就是匹配到結果就好,最少的匹配字符。

默認是貪婪模式;在量詞後面直接加上一個問號?就是非貪婪模式。

字符 說明
* 允許前一個字符可以出現0次或者無數次
+ 前一個字符至少出現1次
? 前一個字符只能出現一次或者不出現
{n} 允許前一個字符只能出現n次
{n,m} 允許前一個字符出現n到m次
{n, } 允許前一個字符至少出現n次

轉義符

轉義字符 描述
\(在行尾時) 續行符
\\ 反斜杠符號
\' 單引號
\" 雙引號
\a 響鈴
\b 退格(Backspace)
\e 轉義
\000
\n 換行
\v 縱向製表符
\t 橫向製表符
\r 回車
\f 換頁
\oyy 八進制數,例如:\o12代表換行
\xyy 十進制數,例如:\x0a代表換行
\other 其他的字符以普通格式輸出

標誌位

標誌 說明
re.S 匹配包括換行在內的所有字符
re.I 使匹配對大小寫不敏感
re.L 做本地化識別(locale-aware)匹配,法語等
re.M 多行匹配,影響^和$
re.X 該標誌通過給予更靈活的格式以便將正則表達式寫得更易於理解
re.U 根據Unicode字符集解析字符,這個標誌影響\w,\W,\b,\B
  1. re.I 使匹配對大小寫不敏感,如下:

    # re.I 的學習,忽略大小寫
    S1 = 'CoN'   #定義字符串i1
    S2 = 'www.xiao.con'    #定義字符串i2
    #print(re.search('CoN','www.xiao.con').group())  #區分大小寫的子組輸出,報有錯
    print(re.search(S1,S2,re.I).group())  #不區分大小寫的子組輸出
    # con
    
  2. re.M 使用^ 和 $ 符號,實現多行多行匹配。如將所有行的末尾字符串輸出得:

    # re.M 的學習,將所有行的尾字母或者首部輸出
    S3 = '''I am girl
            you are boy
            we are friends
            '''                   #定義初始字符串
    print(re.findall(r"\w+$",S3,re.M))   #輸出S3的每行最後一個字符串
    # ['girl', 'boy', 'friends']
    
  3. re.S匹配包括換行在內的所有字符。如下:

    s1 = '''jduedhhelloworld:    
            11630
            passgrthgdg
            '''                     #初始字符串,有換行所以用三引號
    b = re.findall('hello(.*?)pass',s1)   #findal返回字符串中某個正則表達式模式全部的非重複出現的情況,不包含換行,返回列表
    c = re.findall('hello(.*?)pass',s1,re.S)  #包含換行
    print('b is',b)  #輸出B匹配的結果 b is []
    print('c is',c)   #輸出C,包行匹配輸出的結果 c is ['world:    \n        11630\n        ']
    

正則表達式常用函數

1、re.findall()函數

語法:re.findall(pattern, string, flags=0) ——> list(列表)

pattern 匹配的正則表達式
string 要匹配的字符串。
flags 標誌位,用於控制正則表達式的匹配方式

列出字符串中模式的所有匹配項,並作為一個列表返回。如果無匹配,則返回空列表!

import re
print(re.findall(r"ab","abcaaaab"))
['ab', 'ab']               #匹配的值作為一個列表範圍

2、re.compile()函數

語法:re.compile(pattern, flags=0) ——> pattern object

根據包含正則表達式的字符串創建模式對象,可以實現更有效率地匹配!用了re.compile以後,正則對象會得到保留,這樣在需要多次運用這個正則對象的時候,效率會有較大的提升

import re
s=r"^010-\d{8}$"
print(re.findall(s,"010-12345678"))
# ['010-12345678']
p_tel=re.compile(s)     #對s這個正則表達式創建模式對象p_tel
print(p_tel)
# <_sre.SRE_Pattern object at 0x7f3ab3776d78>
print(p_tel.findall("010-12345678"))  
#經過compile轉換的正則表達式對象也能用於普通的re函數,跟上面的re.findall(s,"010-12345678")一樣的效果
# ['010-12345678']

3、re.match()函數

語法:re.match(pattern, string, flags=0) ——> match object or None

在字符串的開始位置匹配正則!如果無匹配,則返回 None 。

import re
s=r"abc"
com=re.compile(s)
com.match("abcdef")                          #abc在開始的位置,可以匹配
# <_sre.SRE_Match object at 0x7f3ab3480cc8>
print(com.match("hhhabc"))                    #abc不在開始的位置,不可以匹配
# None

# 使用group()-返回匹配的數據
com.match("abcddddd").group()   			 #使用group()返回匹配的對象
# 'abc'

4、re.search()函數

語法:re.search(pattern, string, flags=0) ——> match object or None

re.search函數會在字符串內查找模式匹配,只要找到第一個匹配然後返回,如果字符串沒有匹配,則返回None

re.match與re.search的區別:re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。

5、re.sub()函數

語法:re.sub(pattern, repl, string, count=0, flags=0) ——> string

將字符串中所有 pattern 的匹配項用 repl 替換!

import re
re.sub(r"abc","123","abcdefabc")
# '123def123'

6、re.split()函數

語法:re.split(pattern, string, maxsplit=0, flags=0) ——> list

根據模式的匹配項來分割字符串

import re
re.split(r"\d+","aa11bb22cc")  #以正則表達式\d+為分割符
['aa', 'bb', 'cc']
re.split(r"\d","aa11bb22cc")   #以正則表達式\d+為分割符
['aa', '', 'bb', '', 'cc']