3 回答

TA貢獻2039條經驗 獲得超8個贊
混淆是因為反斜杠字符\
在兩個不同的級別用作轉義。首先,Python解釋器本身\
在re
模塊看到你的字符串之前執行替換。例如,\n
轉換為換行符,\t
轉換為制表符等。要獲得實際\
角色,您也可以將其轉義,因此只\\
需要一個\
字符。如果后面的字符\
不是可識別的轉義字符,那么它將\
被視為任何其他字符并通過,但我不建議依賴于此。相反,總是\
通過加倍來逃避你的角色,即\\
。
如果你想看看Python如何擴展你的字符串轉義,只需打印出字符串。例如:
s = 'a\\b\tc'print s
如果s
是聚合數據類型的一部分,例如列表或元組,并且如果打印該聚合,Python將用單引號括起該字符串并包含\
轉義(以規范形式),因此請注意字符串的方式正在印刷。如果您只是在解釋器中鍵入帶引號的字符串,它也會將其顯示在帶有'\'轉義符的引號中。
一旦你知道你的字符串是如何被編碼的,你就可以考慮re
模塊將用它做什么。例如,如果要\
在傳遞給re
模塊的字符串中轉義,則需要傳遞\\
給re
,這意味著您需要\\\\
在引用的Python字符串中使用。Python的字符串將結束與\\
和re
模塊將其視為一個單一的文字\
字符。
\
在Python字符串中包含字符的另一種方法是使用原始字符串,例如r'a\b'
相當于"a\\b"
。

TA貢獻1825條經驗 獲得超4個贊
在對search()的調用中,正則表達式之前的r字符指定正則表達式是原始字符串。這允許反斜杠在正則表達式中用作常規字符,而不是在轉義字符序列中。讓我解釋 ...
在re模塊的搜索方法處理傳遞給它的字符串之前,Python解釋器對字符串進行初始傳遞。如果字符串中存在反斜杠,則Python解釋器必須確定每個是否是Python轉義序列的一部分(例如\ n或\ t)。
注意:此時Python并不關心'\'是否是正則表達式元字符。
如果'\'后跟一個識別的Python轉義字符(t,n等),則反斜杠和轉義字符將替換為實際的Unicode或8位字符。例如,'\ t'將替換為選項卡的ASCII字符。否則它被傳遞并解釋為'\'字符。
考慮以下。
>>> s = '\t'>>> print ("[" + s + "]")>>> [ ] // an actual tab character after preprocessing>>> s = '\d'>>> print ("[" + s + "]")>>> [\d] // '\d' after preprocessing
有時我們希望在字符串中包含一個包含'\'的字符序列,而不會被Python解釋為轉義序列。要做到這一點,我們用'\'來逃避'\'?,F在,當Python看到'\'時,它會用一個'\'字符替換兩個反斜杠。
>>> s = '\\t'>>> print ("[" + s + "]")>>> [\t] // '\t' after preprocessing
在Python解釋器對兩個字符串進行傳遞后,它們將傳遞給re模塊的搜索方法。搜索方法解析正則表達式字符串以標識正則表達式的元字符。
現在'\'也是一個特殊的正則表達式元字符,并且被解釋為一個UNLESS,它在執行re search()方法時被轉義。
考慮以下電話。
>>> match = re.search('a\\t','a\\t') //Match is None
這里匹配是None。為什么?讓我們看看Python解釋器傳遞后的字符串。
String 1: 'a\t'String 2: 'a\t'
那么為什么匹配等于None?當search()解釋String 1時,由于它是正則表達式,因此反斜杠被解釋為元字符,而不是普通字符。但是,字符串2中的反斜杠不在正則表達式中,并且已由Python解釋器處理,因此它被解釋為普通字符。
所以search()方法在字符串'a \ t'中尋找'a escape-t',它們不匹配。
為了解決這個問題,我們可以告訴search()方法不要將'\'解釋為元字符。我們可以通過逃避它來做到這一點。
考慮以下電話。
>>> match = re.search('a\\\\t','a\\t') // Match contains 'a\t'
再次,讓我們看看Python解釋器傳遞后的字符串。
String 1: 'a\\t'String 2: 'a\t'
現在,當search()方法處理正則表達式時,它會看到第二個反斜杠被第一個反斜杠轉義,不應該被視為元字符。因此,它將字符串解釋為'a \ t',它與String 2匹配。
將search()視為'\'作為字符的另一種方法是在正則表達式之前放置一個r。這告訴Python解釋器不要預處理字符串。
考慮一下。
>>> match = re.search(r'a\\t','a\\t') // match contains 'a\t'
這里的Python解釋器不會修改第一個字符串,但會處理第二個字符串。傳遞給search()的字符串是:
String 1: 'a\\t'String 2: 'a\t'
與前面的示例一樣,搜索將'\'解釋為單個字符'\'而不是元字符,因此與字符串2匹配。
添加回答
舉報