溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python字符串和正則表達(dá)式中的反斜杠('\')問題詳解

發(fā)布時間:2020-08-29 14:05:09 來源:腳本之家 閱讀:170 作者:miaoning 欄目:開發(fā)技術(shù)

在Python普通字符串中

在Python中,我們用'\'來轉(zhuǎn)義某些普通字符,使其成為特殊字符,比如

In [1]: print('abc\ndef') # '\n'具有換行的作用
abc
defg

In [2]: print('abc\tdef') # '\t'具有制位符的作用           
abc  defg

我們還可以用'\'來轉(zhuǎn)義特殊字符,使其成為普通字符,比如

In [3]: print('abc\\tdef') # 使'\'成為一個普通的字符,沒有轉(zhuǎn)義作用
abc\tdef

In [4]: print('abc\'tdef') # 使'''成為一個普通的字符,不再需要和另一半單引號'''配對              
abc'tde

所以,在python普通字符串中,我們不能以奇數(shù)個'\'結(jié)尾,這樣會導(dǎo)致結(jié)束的的引號轉(zhuǎn)義成一個純字符,從而使得這段字符串沒有引號來結(jié)束。

在Python原生字符串中

我們在字符串前加一個'r'來表示原生字符串,比如r'abc'。原生字符串中的特殊字符的特殊含義將會被剝奪掉,如下

In [5]: print(r'abc\ndefg') # '\n'沒有換行的作用,僅僅是一個普通的字符串             
abc\ndefg

In [6]: print(r'abc\tdefg') # '\t'沒有制位符的作用,僅僅是一個普通的字符串          
abc\tdef

這里有一個奇怪的問題,在原生字符串中,雖然'\'成為了一個普通的字符串,但我們同樣不能以奇數(shù)個'\'字符串結(jié)尾,這是因為Python正則表達(dá)式的原因,在正則表達(dá)式中我們將會解釋這個問題。

在Python(regular express)正則表達(dá)式中

Python正則表達(dá)式中會有一些不同,正則表達(dá)式中指定了一些元字符(metacharacter),如下

. ^ $ * + ? { } [ ] \ | ( )

它們都具有特殊的含義,'\'也屬于元字符。'\'既屬于Python中的特殊字符,也屬于正則中的元字符,所以使用時得非常小心。那么在正則中,'\'的作用是什么呢?我們看一個例子

In [7]: re.search('.', 'sd.f')               
Out[7]: <_sre.SRE_Match object; span=(0, 1), match='s'>

In [8]: re.search('\.', 'sd.f')              
Out[8]: <_sre.SRE_Match object; span=(2, 3), match='.'>In [9]: re.search('\n', 'sdfd\nfds')            Out[9]: <_sre.SRE_Match object; span=(4, 5), match='\n'>

"""
'.'作為一個元字符,它的特殊含義是匹配任意一個字符,而當(dāng)我們在其前面加'\'后,它的特殊含義消失了,匹配到的是'.';而且'\'依然可以把Python中某些字符轉(zhuǎn)義成特殊字符。
"""

所以,'\'的作用是剝奪元字符的特殊含義,使其成為一個Python字符,所以它還是會具有在Python普通字符串中的轉(zhuǎn)義作用,比如'\n'依然表示換行。所以,'\'既是正則中的一個元字符,又是Python中的一個特殊字符。那么我們該如何匹配到純字符'\'(無任何特殊意義)?

在正則中,'\'的作用是把元字符轉(zhuǎn)義成Python字符串文字(a Python string literal),所以正則中的'\\'其實(shí)是其實(shí)是Python字符中的'\',它仍然還具有轉(zhuǎn)義作用,所以在正則中我們還得對每個'\'再進(jìn)行轉(zhuǎn)義一次,即'\\\\',這樣就可以匹配到純字符'\'了。看下面例子

In [10]: re.search('\\\\', 'fsd\nfds') # 目標(biāo)字符串中沒有純字符'\',所以匹配為空

In [11]: re.search('\\\\', 'fsd\\nfds')                     
Out[11]: <_sre.SRE_Match object; span=(3, 4), match='\\'> # Python字符串中,'\\'就是純字符'\'

在re中反復(fù)的使用'\',這可能會生成大量的連續(xù)的反斜杠,從而導(dǎo)致某些字符串難以理解。解決的辦法是用Python原生字符串來書寫正則表達(dá)式,如下

In [12]: re.search(r'\\', 'fsd\\nfds') # 兩個'\\'就可以匹配到純字符'\'
Out[12]: <_sre.SRE_Match object; span=(3, 4), match='\\'>

另外,當(dāng)我們用原生字符串來書寫正則表達(dá)式時,Python字符中的特殊字符依然有效,比如

In [13]: re.search(r'\n', 'fsd\nfds')                      
Out[13]: <_sre.SRE_Match object; span=(3, 4), match='\n'>
"""
在Python字符中,r'\n'僅僅表示純字符串'\n',沒有換行的作用;在正則中,r'\n'依然還有換行的作用。所以此時我們不能用奇數(shù)個'\'來結(jié)尾某個正則表達(dá)式,這樣導(dǎo)致結(jié)束的引號被轉(zhuǎn)義成一個純字符,無結(jié)束符號。所以,在Python原生字符串中,我們也同樣規(guī)定不能用奇數(shù)個'\'來結(jié)尾。
"""

以上就是本次介紹的全部知識點(diǎn)內(nèi)容,感謝大家對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI