Python進階1 - 正則表達式: 一文掌握正則表達式編程

小馬哥正在為Python的所有常見知識進行匯總,更會有大量實戰(zhàn)項目
點擊--> 全棧工程師養(yǎng)成---Python內(nèi)容導航頁 <--查看所有Python內(nèi)容

導語

正則表達式本質(zhì)是一種字符串模式或者叫字符串模板,用來匹配一些列的字符串,找到目標字符串的過程就是匹配或者搜索,找到這些目標字符串之后,就可以對其進行提取,進行拆分,進行替換等等. 這也就是正則表達式和編程語言的邏輯關(guān)系,正則表達式規(guī)定了如何定義模式,編程語言使用正則表達式確定的邏輯模式,進行功能實現(xiàn)(匹配,搜索,提取,查分,替換等功能).

主要內(nèi)容:

  • (2)先使用Python的re模塊,實現(xiàn)正則表達式編程
  • (1)正則表達式基本知識點

我故意把順序倒過來,雖然先有正則再有Python對正則表達式的支持, 我們先把知識用起來,然后不用太多解釋,你已經(jīng)清楚正則是用來干什么了.目的還是保證: 一篇文章精通正則表達式,以及Python使用正則表達式熟練編程.

(一)用Python針對正則表達式編程

先把"見豬跑",直觀認識正則表達式與Python利用正則表達式實現(xiàn)一定功能,介紹常用的函數(shù)或者方法

1.1 match()函數(shù)

作用: 匹配正則表達式,如果匹配成功就返回一個匹配對象;如果匹配失敗,就返回None. 匹配對象的group()方法用于顯示成功的匹配.

例1,實現(xiàn)最簡單的正則表達式,

import re
# 正則表達式模式
pattern = 'China'
# 字符串文本
data = 'China'
# 通過re模塊的的match方法,從data的起始部分開始,對正則表達式模式進行比對,如果匹配,返回一個匹配對象;否則返回None
result = re.match(pattern,data)
print(type(result))  # 返回 <class 're.Match'>
print(result.group()) # Match對象的group()會返回成功的匹配.

例2,最簡單的正則表達式模式,之如果匹配失敗是什么樣子的

import re

pattern = 'China'
datas= 'Chinese','Python','China is a great country'

for data in datas:
    result = re.match(pattern,data)
    if result is not None:
        print("匹配成功: ",result)
    else:
        print('匹配失敗: ',data)
匹配失敗:  Chinese
匹配失敗:  Python
匹配成功:  <re.Match object; span=(0, 5), match='China'>

上面的模式(或者認為是模板)中,pattern就是一個簡單的字符串,但是這樣的模式只能匹配一個單詞,如果想匹配更多的情況,模式應該怎么寫?

例3,能夠匹配一個范圍的字符

import re
pattern = '[abc]'   #使用[]括起來的內(nèi)容,代表一個集合,代表匹配集合內(nèi)的任意一個字符,[abc]代表可以匹配a或者b或者c
datas = 'a','b','c','e','xay'

for data in datas:
    result = re.match(pattern,data)
    if result is not None:
        print('Match Successfully: ',result.group())  # group()函數(shù)的作用: 返回Match對象匹配到的字符內(nèi)容
    else:
        print('Match Failed: ',data)

例4,上面的例子中[abc]指代了一個集合,元素之間是或的關(guān)系,也可以把這個集合看做一個范圍,

還有一種表示方法[a-z][A-Z][0-9],也是指代范圍,[a-c]也是同樣的意思

import re
pattern = '[a-e]'   #[a-e]代表了a到e這個字符范圍內(nèi)的任何一個字符
datas = 'a','b','c','e','xay'

for data in datas:
    result = re.match(pattern,data)
    if result is not None:
        print('Match Successfully: ',result.group())  # group()函數(shù)的作用: 返回Match對象匹配到的字符內(nèi)容
    else:
        print('Match Failed: ',data)

例5,點號'.' 匹配任意的單個字符(換行符和非字符除外)

import re
pattern = '李.'
names='李逵','李鬼','小李'
for name in names:
    isMatched = re.match(pattern,name)
    if isMatched:
        print('Match Successfully: ',isMatched)
    else:
        print('Match Faied: ',name)
Match Successfully:  <re.Match object; span=(0, 2), match='李逵'>
Match Successfully:  <re.Match object; span=(0, 2), match='李鬼'>
Match Faied:  小李

1.2 search()函數(shù)

作用: 在字符串中查找指定的模式,返回第一次出現(xiàn)的位置

match()函數(shù)的作用是在目標字符串的起始位置開始匹配,是否符合正則表達式模式. 我們很多場景可能不一定在字符串起始位置,更多情況是在字符內(nèi)搜索是否有匹配正則模式的字符串存在,這就是search()函數(shù)的存在意義了.

例1,在一段文本中查找目標字符串

import re
data = '我愛偉大的祖國,I love China,China is a great country'     #China在data字符串中的位置區(qū)間為[15,20)  半開半閉區(qū)間
pattern = 'China'
result = re.search(pattern,data)
print(result.group())

print(data[19])

China
a

例2,點號"."的使用,搜索除去換行符之外的任意字符

import re
sentence='華為是華人的驕傲'    #1,通過這個句子1可以體會點號的作用;2,search()函數(shù)會返回第一次匹配
pattern='華.'
result = re.search(pattern,sentence)   
if result:
    print(result.group())
華為

who laughs last laughs best

1.3 findall()和finditer()函數(shù)

作用:

  • findall()查詢字符串中某個正則表達式全部的非重復出現(xiàn)情況,返回的是一個列表.
  • finditer()返回的是一個迭代器,所以相比findall()更加節(jié)省內(nèi)存
import re
sentence='華為是華人的驕傲'
pattern = '華.'
result = re.findall(pattern,sentence)
print(result)
['華為', '華人']
import re
sentence = '華為是華人的驕傲'
pattern = '華.'
result = re.finditer(pattern,sentence)
print(type(result))
<class 'callable_iterator'>

1.4 group()和groups()方法

作用: 匹配對象的兩個方法

  • 匹配對象: match()或者search()成功調(diào)用后返回的對象

  • 子組: 圓括號對匹配模式的各個部分進行分組和提取操作,子組可以帶來的方便是,不用通過match之后,再來對特定字符串進行抽取

  • group(): 返回整個匹配對象或者返回特定的子組

  • groups(): 返回一個包含唯一或者全部子組的元組

  • 如果沒有子組的要求,那么當group()仍然返回整個匹配時,groups()返回一個空元組.

例1,無子組的模式返回使用group()匹配對象

import re
pattern = 'a'
data = 'abcd'
result = re.match(pattern,data)
print(result)
print(result.group())
print(result.groups())
<re.Match object; span=(0, 1), match='a'>
a
()
import re
pattern = '(華.)\w(華.)'
sentence = '華為是華人的驕傲'
result = re.search(pattern,sentence)
print(result)
print(result.group())  #返回整個匹配對象
print(result.group(0)) #返回整個匹配對象
print(result.group(1)) #返回子組1
print(result.group(2)) #返回子組2
print(result.groups()) #返回包含所有子組的元組
<re.Match object; span=(0, 5), match='華為是華人'>
華為是華人
華為是華人
華為
華人
('華為', '華人')

1.5 compile()函數(shù)

作用: 編譯正則表達式

import re
pattern = '(華.)\w(華.)'
sentence = '華為是華人的驕傲'
compiled_pattern = re.compile(pattern)  #<class 're.Pattern'>
print(type(compiled_pattern))
# result = re.match(compiled_pattern,sentence)   #(-1-)這樣做,
result = re.match(pattern,sentence)       # (-2-)<class 're.Match'>
print(result)#(-1-)(-2-)得到的結(jié)果都是一樣的,但是在多次用到compiled_pattern的時候,會節(jié)省了編譯pattern的這個過程
<class 're.Pattern'>
<re.Match object; span=(0, 5), match='華為是華人'>

1.6 sub()和subn()函數(shù)

作用: 實現(xiàn)搜索和替換(找到目標字符串,然后替換掉)

sub()完成替換,返回一個被替換完成之后的字符串

subn()完成替換,還返回被替換的數(shù)量,字符串和數(shù)組,組成元組返回

import re
sentence = 'Java是很受歡迎的編程語言'
pattern = '[a-zA-Z]+'   # [字符集范圍]   " + "代表: 前面的模式出現(xiàn)1次以上

result = re.sub(pattern,'Python',sentence)  # 使用新的Python替代
print(result)
resultn = re.subn(pattern,'Python',sentence)
print(resultn)
Python是很受歡迎的編程語言
('Python是很受歡迎的編程語言', 1)
import re
sentence = 'Java是一門強大的語言,Go前途不錯'
pattern = 'Java|Go'  # 或關(guān)系
result = re.sub(pattern,'Python',sentence)
print(result)
Python是一門強大的語言,Python前途不錯

1.7 split()

作用: 實現(xiàn)分隔字符串

import re
data = '百度,騰訊,阿里,華為,智能天下'
pattern = ','
result = re.split(pattern,data)
print(type(result))
print(result)
<class 'list'>
['百度', '騰訊', '阿里', '華為', '智能天下']

(二) 正則表達式的知識點匯總

介紹正則的知識點,用于編輯正則表達式,

2.1 正則模式中的字符

  • 最簡單的,任意一個字符串都是一個正則表達式的模式(但是這樣的通用性不強,只能匹配一個特定字符串,沒有什么意義)

  • 匹配一定范圍內(nèi)的單個字符1[abc]: 中括號里面的內(nèi)容即"或"的關(guān)系

  • 匹配一定范圍內(nèi)的單個字符2[a-c]: 使用連接符,代表范圍,[a-z][0-9]

  • 代表單個字符的特殊符號:

    1. "."點號: 匹配任意字符(字母,數(shù)字,特殊字符,但是換行符除外)

    2. \w: 匹配任意字母,數(shù)字(比上面的"."少了特殊字符)

    3. \d: 匹配任意十進制數(shù)字(比上面的\w少了字母)

    4. \s: 匹配空白

    5. \b: 匹配邊界

    6. ^: 匹配開始

    7. $: 匹配結(jié)尾

    8. 注意: 如果要在模式中匹配上面出現(xiàn)的特殊字符,例如: ".","","^","$",需要使用轉(zhuǎn)義字符:\

2.2 正則中頻數(shù)的表示

概括的表示頻數(shù)

  • *: 代表匹配0次或者多次
  • +: 代表匹配1次或者多次
  • ?: 代表匹配0次或者一次

精確的表示頻數(shù)

  • {n}: 代表前面的模式出現(xiàn)n次
  • {m,n}: 代表前面的模式出現(xiàn)m到n次之間

2.3 其它重要知識點

分組

模式中被"()"括起來的內(nèi)容,是可以被提取的,Python以及各種語言實現(xiàn)了這種功能,group()

模式的邏輯或與否定

  1. "|" 代表兩個模式的或關(guān)系

    例如: bat|tmd 可以匹配:bt,bm,bd,at,am,ad,tt,tm,td

    同: [bat][tmd]

  2. "^" 除匹配字符串的開始之外,如果用在[]中,代表否定的意思

    例如: [\d]代表的是一個十進制數(shù),[^\d]代表除十進制數(shù)之外的其它模式

正則表達式的擴展表示法

2.4 轉(zhuǎn)義字符與原始字符串

轉(zhuǎn)義字符: \ 在字符串中,轉(zhuǎn)義字符用于輸出一些特殊字符,例如:\b,代表的是退格,\n代表換行,\t代表制表符,本質(zhì)上,字符串的轉(zhuǎn)義字符,是為了打印準備的,所以我們暫且定義: 字面量和打印量

原始字符串: 把字母"r"放在字符串開頭,代表這是一個原始字符串,它的作用在于消除字符串和正則表達式之間各自關(guān)于轉(zhuǎn)義的歧義,例如: \b在正則中表示邊界

在cmd窗口里面,定義一個字符串data = '\',輸入data與print(data)得到的是不一樣的結(jié)果,前者是'\',后者是'',這就是字面量和打印量的區(qū)別

這個時候再來解釋轉(zhuǎn)義在字符串中和正則中的歧義問題就明了了

data = 'ab\cd' # 現(xiàn)在需要要匹配出data中的\怎么處理

首先,data的字面量,也就是字符串的真實值看似是'ab\cd',其實,你用cmd窗口,直接輸出data而不是print(data),會發(fā)現(xiàn),字符串的字面顯示: ab\cd
所以要匹配出來data的'',pattern要如何寫呢?

pattern1 = ''

pattern2 = '\'

pattern3 = '\\'

結(jié)果是第三個,首先pattern是一個字符串,雖然要交給正則表達式引擎去解析,但是終歸是一個字符串,那么就要經(jīng)過字符串的轉(zhuǎn)義處理,第一個語法錯誤,這個''首先轉(zhuǎn)義了結(jié)尾的"'",字符串沒有結(jié)尾了;第二個,'\'是正確的字符串,經(jīng)過字符串轉(zhuǎn)義后,字面量是\,傳遞給正則引擎的時候和打印的時候一樣,是'',但是真實的data字面量是'\',肯定匹配不到,于是只能用第三種

小馬哥正在為Python的所有常見知識進行匯總, 更會有大量實戰(zhàn)項目
點擊--> 全棧工程師養(yǎng)成---Python內(nèi)容導航頁 <--查看所有Python內(nèi)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Python中的正則表達式(re) import rere.match #從開始位置開始匹配,如果開頭沒有則無re...
    BigJeffWang閱讀 7,559評論 0 99
  • `>本文是 Jan Goyvaerts 為 RegexBuddy 寫的教程的譯文,版權(quán)歸原作者所有 在本文中講述了...
    極客圈閱讀 2,202評論 0 5
  • #首先,python中的正則表達式大致分為以下幾部分: 元字符 模式 函數(shù) re 內(nèi)置對象用法 分組用法 環(huán)視用法...
    mapuboy閱讀 1,704評論 0 51
  • re模塊手冊 本模塊提供了和Perl里的正則表達式類似的功能,不關(guān)是正則表達式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,183評論 0 13
  • 搞懂Python 正則表達式用法 Python 正則表達式 正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一...
    廈熱閱讀 1,754評論 0 2

友情鏈接更多精彩內(nèi)容