首頁 > 軟體

python正規表示式re.sub各個引數的超詳細講解

2022-07-26 18:00:42

一、re.sub(pattern, repl, string, count=0, flags=0)

re是正則的表示式,sub是substitute,表示替換

re.sub共有五個引數。

re.sub(pattern, repl, string, count=0, flags=0)

其中三個必選引數:pattern, repl, string

兩個可選引數:count, flags

二、引數講解

1、pattern引數

pattern,表示正則中的模式字串,這個沒太多要解釋的。

需要知道的是:

反斜槓加數位:N,則對應著匹配的組:matched group

比如6,表示匹配前面pattern中的第6個group

意味著,pattern中,前面肯定是存在對應的組,後面也才能去參照

舉個例子

hello xinfa, nihao xinfa

我們想把xinfa替換成linxinfa,就可以這樣:

import re

inputStr = "hello xinfa, nihao xinfa"
replacedStr = re.sub(r"hello (w+), nihao 1", "linxinfa", inputStr)
print("replacedStr = ", replacedStr) 
#輸出結果為: replacedStr = linxinfa

注意,上面的(w+),括號括起來表示一個組;

裡面的w表示匹配字母、數位、下劃線,等價於[A-Za-z0-9_]

然後+表示匹配前面的子表示式一次或多次。

所以(w+)就是匹配多個字母、數位、下劃線的意思。表示式中的1表示匹配第一個組,第一個組就是(w+)

2、repl引數

repl,就是replacement,被替換的字串的意思。

repl可以是字串,也可以是函數。

2.1、repl是字串

如果repl是字串的話,其中的任何反斜槓跳脫字元,都會被處理。

比如:

n:會被處理為對應的換行符;

r:會被處理為回車符;

其他不能識別的轉移字元,則只是被識別為普通的字元: 比如j,會被處理為j這個字母本身;

比較特殊的是g<n>g表示匹配組,n是組的id,比如g<1>表示第一個組。

還是上面的例子,我們想把xinfa提取出來,只剩xinfa

hello xinfa, nihao xinfa

就可以這樣寫:

import re

inputStr = "hello xinfa, nihao xinfa"
replacedStr = re.sub(r"hello (w+), nihao 1", "g<1>", inputStr)
print("replacedStr = ", replacedStr) 
#輸出結果為: replacedStr = xinfa

2.2、repl是函數

比如輸入內容是:

hello 123 world 456

想要把其中的數位部分,都加上111,變成:

hello 234 world 567

那麼就可以這樣:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re;

def pythonReSubDemo():
    """
        demo Pyton re.sub
    """
    inputStr = "hello 123 world 456"

    def _add111(matched):
        intStr = matched.group("number")
        intValue = int(intStr)
        addedValue = intValue + 111
        addedValueStr = str(addedValue)
        return addedValueStr

    replacedStr = re.sub("(?P<number>d+)", _add111, inputStr)
    print("replacedStr=",replacedStr) 
    #輸出結果為:replacedStr= hello 234 world 567

if __name__=="__main__":
    pythonReSubDemo()

注意上面,用了一個?P<value>

?P的意思就是命名一個名字為value的組,匹配規則符合後面的d+

3、string引數

string,即表示要被處理,要被替換的那個string字串。

4、count引數

舉例說明:

繼續之前的例子,假如對於匹配到的內容,只處理其中一部分。

比如:

hello 123 world 456 nihao 789

我們只是想要處理前面兩個數位:123,456,分別給他們加111,而不處理789

那麼就可以這樣:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re;

def pythonReSubDemo():
    """
        demo Pyton re.sub
    """
    inputStr = "hello 123 world 456 nihao 789"

    def _add111(matched):
        intStr = matched.group("number")
        intValue = int(intStr)
        addedValue = intValue + 111 
        addedValueStr = str(addedValue)
        return addedValueStr

    replacedStr = re.sub("(?P<number>d+)", _add111, inputStr, 2)
    print("replacedStr = ", replacedStr)
	#輸出結果為:replacedStr = hello 234 world 567 nihao 789

if __name__=="__main__":
    pythonReSubDemo()

5、flags引數

flags編譯標誌。編譯標誌讓你可以修改正規表示式的一些執行方式。

re模組中標誌可以使用兩個名字,一個是全名如IGNORECASE,一個是縮寫,一字母形式如I。(如果你熟悉 Perl 的模式修改,一字母形式使用同樣的字母;例如re.VERBOSE的縮寫形式是re.X。)

多個標誌可以通過按位元它們來指定。如re.I | re.M被設定成IM標誌。

下面列舉下常用的編譯標誌

5.1、IGNORECASE(簡寫I)

使匹配對大小寫不敏感;

舉個例子,[A-Z]也可以匹配小寫字母,Spam可以匹配 Spam、spamspAM

5.2、LOCALE(簡寫L)

localesC語言庫中的一項功能,是用來為需要考慮不同語言的程式設計提供幫助的。

舉個例子,如果你正在處理法文文字,你想用 w+來匹配文字,但w只匹配字元類[A-Za-z],它並不能匹配é

如果你的系統設定適當且在地化設定為法語,那麼內部的 C函數將告訴程式é也應該被認為是一個字母。

當在編譯正規表示式時使用 LOCALE標誌會得到用這些 C函數來處理 w後的編譯物件,這會更慢,但也會象你希望的那樣可以用w+來匹配法文文字。

5.3、MULTILINE(簡寫M)

MULTILINE多行的意思,改變 ^ 和 $ 的行為。

使用 ^只匹配字串的開始,而 $則只匹配字串的結尾和直接在換行前(如果有的話)的字串結尾。

當本標誌指定後,^匹配字串的開始和字串中每行的開始。同樣的, $元字元匹配字串結尾和字串中每行的結尾(直接在每個換行之前)。

例如

import re

s='hello nworld nxinfa'
print(s)

pattern=re.compile(r'^w+')
print(re.findall(pattern,s))

#加上flags=re.M
pattern=re.compile(r'^w+', flags=re.M)
print(re.findall(pattern,s))

輸出結果為

hello 
world 
xinfa
['hello']
['hello', 'world', 'xinfa']

5.4、DOTALL(簡寫S)

此模式下 .的匹配不受限制,可匹配任何字元,包括換行符,也就是預設是不能匹配換行符。

例:

 #!/usr/bin/python
# -*- coding: utf-8 -*-
import re

s = '''first line
    ...: second line
    ...: third line'''

regex=re.compile('.+')
print(regex.findall(s))

regex=re.compile('.+', re.S)
print(regex.findall(s))

輸出結:

['first line', '    ...: second line', '    ...: third line']
['first linen    ...: second linen    ...: third line']

5.5、VERBOSE(簡寫X)

冗餘模式, 此模式忽略正規表示式中的空白和#號的註釋。
例:

email_regex = re.compile("[w+.]+@[a-zA-Zd]+.(com|cn)")
 
email_regex = re.compile("""[w+.]+  # 匹配@符前的部分
                            @  # @符
                            [a-zA-Zd]+  # 郵箱類別
                            .(com|cn)   # 郵箱字尾  """, re.X)

補充:repl為函數時的用法

當repl為函數時的替換更加靈活,此時可以在函數中自定義在某種特定的匹配下替換為某種特定的字元。

範例

import re
 
# 將匹配的數位乘以 2
def double(matched):
    print('matched: ',matched)
    print("matched.group('value'): ",matched.group('value'))
    value = int(matched.group('value'))
    return str(value * 2)
 
string = 'A23G4HFD567'
print(re.sub('(?P<value>d+)', double, string))

總結

到此這篇關於python正規表示式re.sub各個引數的超詳細講解的文章就介紹到這了,更多相關python正規表示式re.sub引數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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