2013-11-28 45 views
2

更新1:Python 3.3.3 re.compile('e')和re.compile(' e')發生了什麼?

>>> '\e' 
'\\e' 

以上情況說明,Python的文本分析器對待'\e'兩個文字\e。我對嗎?如果是這樣, re.compile('\e')也應遵循此規則第一。即它應該匹配兩個文字\e。像這樣:

>>> re.findall('\e','\e\e') 
['\e', '\e'] 

如果我錯了,爲什麼?

原題:

爲了方便我用RER指示蟒蛇標準庫re模塊的機制。

我已經閱讀了python doc中的相關文章。我知道警告「強烈建議您爲所有人使用原始字符串,但最簡單的表達方式」。但我只想知道如果我不使用原始字符串,re.compile將如何工作。只需看一看:

>>> A=re.compile('\e') 
>>> B=re.compile('e') 
>>> A==B 
False 
>>> re.findall(A,'eee') 
['e', 'e', 'e'] 
>>> re.findall(B,'eee') 
['e', 'e', 'e'] 

正如您所看到的,A和B在執行搜索時沒有什麼不同。然後:

爲什麼'\ e'可以匹配字符串字面值'e'?

你能找到一個會產生差異的字符串文字嗎?

的另一個問題是,爲什麼re.compile('\\')會引發錯誤。請注意,這是一個關於re機制的問題,而不是如何編寫re源代碼。因爲我覺得:

顯然\\意味着一個反斜槓,RER爲什麼不知道?爲什麼我們需要一個模式\\\\來匹配文字反斜槓?看看這個:

>>> re.findall('\n','\n') 
['\n'] 

完美的作品。但是,如果將n更改爲\,則會引發錯誤。這對我來說很難理解。

會發生什麼,如果快線RER允許\\匹配一個反斜槓?它是不是像重新存在的基礎?如果是這樣,你能舉個例子嗎?

在此先感謝。它讓我困惑很久。

回答

2
  1. \ee對於正則表達式是相同的。正則表達式中的\用於表示以下字符具有特殊含義。你可以找到有效的特殊序列列表here,而\e不是其中的一個。所以,\前面e被忽略。
  2. 當你在你的代碼中說\\時,你實際上用正則表達式說\。我們知道,\爲此後的角色賦予了特殊的含義。但是當我們說\\時,那裏沒有任何字符。這就是爲什麼它給出了這個錯誤信息。要實際匹配\,您需要像這樣\\\\轉義\。或者您可以使用raw string notation這樣

    re.compile(r'\\') 
    print(re.findall(C, "\\")) 
    

http://docs.python.org/3/library/re.html

正則表達式引用使用反斜槓字符(「\」)來表示 特殊形式或允許特殊字符使用沒有 援引他們的特殊含義。這與Python的 在字符串文字中用於相同目的的用法相沖突;對於 的示例,要匹配文字反斜槓,可能必須將'\\' 作爲模式字符串,因爲正則表達式必須是\,並且 每個反斜槓必須在常規Python字符串 之內表示爲\。

解決方案是使用Python的原始字符串表示法來定期使用 表達式模式;在 中,不以任何特殊方式處理反斜槓,字符串文字前綴爲'r'。因此r「\ n」是包含'\'和'n'的雙字符字符串 ,而「\ n」是包含換行符的單字符字符串 。通常模式將使用這種原始字符串表示法以Python 代碼表示。

+0

我知道規則'當你在你的代碼中說'\'時,你實際上在正則表達式中說'\'。我不知道爲什麼我們不能說'當你在代碼中說'\'時,你也會在正則表達式中說\'。 – tcpiper

+0

@Pythoner'\\'實際上是在python代碼中轉義'\'。所以,我們實際上是將'\'傳遞給正則表達式。 – thefourtheye

3

有兩層這裏:第一,有Python字符串文字語法,然後還有的正則表達式語法。

\e沒有在Python字符串中的任何特殊含義的文字,所以兩個角色獲得逐字傳遞給正則表達式引擎,在那裏他們匹配e,因爲這是\意味着在這方面:它會從任何特殊含義以下字符。 (e在正則表達式中沒有任何特殊含義的事實並不是馬特)。

+0

是的,這正是我的想法。根據這個邏輯,'re.compile('\\')'應該匹配一個文字反斜槓,因爲第一個\從以下\中刪除了任何特殊的含義。 – tcpiper

相關問題