中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Python3 如何優(yōu)雅地使用正則表達(dá)式(詳解六)

Python3 如何優(yōu)雅地使用正則表達(dá)式(詳解六)

修改字符串

我們已經(jīng)介紹完如何對(duì)字符進(jìn)行搜索,接下來我們講講正則表達(dá)式如何修改字符串。

正則表達(dá)式使用以下方法修改字符串:

方法用途
split()在正則表達(dá)式匹配的地方進(jìn)行分割,并返回一個(gè)列表
sub()找到所有匹配的子字符串,并替換為新的內(nèi)容
subn()跟 sub() 干一樣的勾當(dāng),但返回新的字符串以及替換的數(shù)目



分割字符串

正則表達(dá)式的 split() 方法將字符串在匹配的地方進(jìn)行分割,并將分割后的結(jié)果作為列表返回。它的做法其實(shí)很像字符串的 split() 方法,但這個(gè)可以使用更加廣泛的分隔符。你猜的沒錯(cuò),它同時(shí)提供了一個(gè)模塊級(jí)別的函數(shù):re.split()

.split(string[, maxsplit=0])

通過正則表達(dá)式匹配來分割字符串。如果在 RE 中,你使用了捕獲組,那么它們的內(nèi)容會(huì)作為一個(gè)列表返回。你可以通過傳入一個(gè) maxsplit 參數(shù)來設(shè)置分割的數(shù)量。如果 maxsplit 的值是非 0,表示至多有 maxsplit 個(gè)分割會(huì)被處理,剩下的內(nèi)容作為列表的最后一個(gè)元素返回。


下邊例子中,分隔符是任何非字母數(shù)字字符:

  1. >>> p = re.compile(r'\W+')
  2. >>> p.split('This is a test, short and sweet, of split().')
  3. ['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', '']
  4. >>> p.split('This is a test, short and sweet, of split().', 3)
  5. ['This', 'is', 'a', 'test, short and sweet, of split().']
復(fù)制代碼


有時(shí)候你可能不僅對(duì)分隔符之間的內(nèi)容感興趣,你可能對(duì)分隔符本身(就是正則表達(dá)式匹配的內(nèi)容)也同樣感興趣。如果使用了捕獲組,那么作為分隔符的值也會(huì)被返回:

  1. >>> p = re.compile(r'\W+')
  2. >>> p2 = re.compile(r'(\W+)')
  3. >>> p.split('This... is a test.')
  4. ['This', 'is', 'a', 'test', '']
  5. >>> p2.split('This... is a test.')
  6. ['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']
復(fù)制代碼


模塊級(jí)別的函數(shù) re.split() 除了將 RE 作為第一個(gè)參數(shù)外,其他參數(shù)是一樣的:

  1. >>> re.split('[\W]+', 'Words, words, words.')
  2. ['Words', 'words', 'words', '']
  3. >>> re.split('([\W]+)', 'Words, words, words.')
  4. ['Words', ', ', 'words', ', ', 'words', '.', '']
  5. >>> re.split('[\W]+', 'Words, words, words.', 1)
  6. ['Words', 'words, words.']
復(fù)制代碼



搜索和替換

另一個(gè)常見的任務(wù)就是找到所有的匹配部分,并替換成不同的字符串。sub 方法可以幫你實(shí)現(xiàn)這個(gè)愿望!sub 方法有一個(gè)replacement 參數(shù),它可以是一個(gè)待替換的字符串,或者一個(gè)處理字符串的函數(shù)。

.sub(replacementstring[, count=0])

返回一個(gè)字符串,這個(gè)字符串從最左邊開始,所有 RE 匹配的地方都替換成 replacement。如果沒有找到任何匹配,那么返回原字符串。

可選參數(shù) count 指定最多替換的次數(shù),必須是一個(gè)非負(fù)值。默認(rèn)值是 0,意思是替換所有找到的匹配。


下邊是使用 sub() 方法的例子,它會(huì)將所有的顏色替換成 color

  1. >>> p = re.compile( '(blue|white|red)')
  2. >>> p.sub( 'colour', 'blue socks and red shoes')
  3. 'colour socks and colour shoes'
  4. >>> p.sub( 'colour', 'blue socks and red shoes', count=1)
  5. 'colour socks and red shoes'
復(fù)制代碼


subn() 方法跟 sub() 方法干同樣的勾當(dāng),但區(qū)別是返回值為一個(gè)包含有兩個(gè)元素的元組:一個(gè)是替換后的字符串,一個(gè)是替換的數(shù)目。

  1. >>> p = re.compile( '(blue|white|red)')
  2. >>> p.subn( 'colour', 'blue socks and red shoes')
  3. ('colour socks and colour shoes', 2)
  4. >>> p.subn( 'colour', 'no colours at all')
  5. ('no colours at all', 0)
復(fù)制代碼


空匹配只有在它們沒有緊挨著前一個(gè)匹配時(shí)才會(huì)被替換掉:

  1. >>> p = re.compile('x*')
  2. >>> p.sub('-', 'abxd')
  3. '-a-b-d-'
復(fù)制代碼


如果 replacement 參數(shù)是一個(gè)字符串,那么里邊的反斜杠都會(huì)被處理。比如 \n 將會(huì)被轉(zhuǎn)換成一個(gè)換行符,\r 轉(zhuǎn)換成回車,等等。未知的轉(zhuǎn)義如 \j 保持原樣。逆向引用如 \6,則被 RE 中相應(yīng)的捕獲組匹配的內(nèi)容所替換。這使你可以在替換后的字符串中插入一部分原字符串。

下邊例子中,將匹配被 { 和 } 括起來的單詞 section,并將 section 替換成 subsection

  1. >>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)
  2. >>> p.sub(r'subsection{\1}','section{First} section{second}')
  3. 'subsection{First} subsection{second}'
復(fù)制代碼


小甲魚解釋:1. 大家還記得嗎?這里開啟了 re.VERBOSE,空格將被忽略。因?yàn)檫@里一堆符號(hào),用空格隔開看著才不會(huì)亂糟糟的......2. 這里 r'subsection{\1}' 使用 \1 引用匹配模式中的 ([^}]*) 匹配的字符串內(nèi)容。

還可以使用 Python 的擴(kuò)展語法 (?P<name>...) 指定命名組,引用命名組的語法是 \g<name>。\g<name> 會(huì)將名字為name 的組匹配的字符串替換進(jìn)去。另外,\g<數(shù)字> 是通過組的序號(hào)進(jìn)行引用。\g<2> 其實(shí)就相當(dāng)于 \2,但我們更提倡使用 \g<2>,因?yàn)檫@樣可以避免歧義。例如,\g<2>0 的含義是引用序號(hào)為 2 的組,然后后邊匹配一個(gè)字符 '0',而你寫成\20 就會(huì)被認(rèn)為是引用序號(hào)為 20 的組了。

  1. >>> p = re.compile('section{ (?P<name> [^}]* ) }', re.VERBOSE)
  2. >>> p.sub(r'subsection{\1}','section{First}')
  3. 'subsection{First}'
  4. >>> p.sub(r'subsection{\g<1>}','section{First}')
  5. 'subsection{First}'
  6. >>> p.sub(r'subsection{\g<name>}','section{First}')
  7. 'subsection{First}'
復(fù)制代碼


有時(shí)候你可能不滿足簡(jiǎn)單的字符串替換,你可能需要在替換的過程中動(dòng)點(diǎn)“手腳”......沒關(guān)系,一樣可以滿足你!replacement 參數(shù)還可以是一個(gè)函數(shù),該函數(shù)將會(huì)在正則表達(dá)式模式每次不重復(fù)匹配的時(shí)候被調(diào)用。在每次調(diào)用時(shí),函數(shù)會(huì)收到一個(gè)匹配對(duì)象的參數(shù),因此你就可以利用這個(gè)對(duì)象去計(jì)算出新的字符串并返回它。

下邊的例子中,替換函數(shù)將十進(jìn)制數(shù)替換為十六進(jìn)制數(shù):

  1. >>> def hexrepl(match):
  2. ...     "Return the hex string for a decimal number"
  3. ...     value = int(match.group())
  4. ...     return hex(value)
  5. ...
  6. >>> p = re.compile(r'\d+')
  7. >>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
  8. 'Call 0xffd2 for printing, 0xc000 for user code.'
復(fù)制代碼


當(dāng)使用模塊級(jí)的 re.sub() 函數(shù)時(shí),正則表達(dá)式模式作為第一個(gè)參數(shù)。該模式可以是一個(gè)字符串或一個(gè)編譯好的對(duì)象。如果你需要指定正則表達(dá)式標(biāo)志,那么你必須使用后者;或者使用模式內(nèi)嵌修正器,例如 sub("(?i)b+", "x", "bbbb BBBB") 返

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
R語言中使用read.table函數(shù)讀取文件數(shù)據(jù)方法詳解
VBA學(xué)習(xí)實(shí)踐——用VBA實(shí)現(xiàn)Excel格數(shù)據(jù)分列功能
TEXT 函數(shù) (文本函數(shù))
C#正則表達(dá)式快速入門(簡(jiǎn)介)
按分隔符拆分單元格終結(jié)篇,利用VBA一勞永逸解決所有這類問題
VBA JOIN函數(shù)詳解
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服