正則表達式之前的r字符在調用search()時指示正則表達式是原始字符串。這允許反斜槓在正則表達式中用作常規字符而不是字符的轉義序列。讓我解釋一下......
在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的解釋爲轉義序列。要做到這一點,我們用'\'來避開'\'。現在,當Python看到'\'時,它將用一個'\'字符替換兩個反斜槓。
>>> s = '\\t'
>>> print ("[" + s + "]")
>>> [\t] // '\t' after preprocessing
在Python解釋器對這兩個字符串進行傳遞之後,它們被傳遞給re模塊的搜索方法。搜索方法分析正則表達式字符串以標識正則表達式的元字符。
現在'\'也是一個特殊的正則表達式元字符,並被解釋爲一個,除非在執行re search()方法時被轉義。
請考慮以下調用。
>>> match = re.search('a\\t','a\\t') //Match is None
這裏,匹配是無。爲什麼?讓我們看看Python解釋器通過後的字符串。
String 1: 'a\t'
String 2: 'a\t'
那麼爲什麼匹配等於無?當search()解釋字符串1時,由於它是一個正則表達式,反斜槓被解釋爲元字符,而不是普通字符。然而,字符串2中的反斜槓不是正則表達式,並且已經由Python解釋器處理,所以它被解釋爲普通字符。
因此,search()方法正在尋找字符串'a \ t'中不匹配的'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',它與字符串2匹配。
將search()視爲字符的另一種方法是在正則表達式之前放置一個r。這告訴Python解釋器不要預處理字符串。
請考慮這一點。
>>> match = re.search(r'a\\t','a\\t') // match contains 'a\t'
這裏的Python解釋器不會修改第一個字符串,但會處理第二個字符串。 ()傳遞到查詢的字符串是:
String 1: 'a\\t'
String 2: 'a\t'
如在先前的例子中,搜索解釋「\」爲單個字符「\」,而不是一個元字符,因此與字符串2
匹配
http://stackoverflow.com/questions/24085680/why-do-backslashes-appear-twice – fghj
可能重複[無法用正則表達式逃避反斜槓?](https://stackoverflow.com/questions/4025482/無法使用正則表達式反斜槓) – tripleee