2013-02-26 109 views
0
>>> pattern = re.compile(r'(.*)\\\\(.*)\\\\(.*)') 
>>> m = re.match(pattern, 'string1\string2\string3') 
>>> m 
>>> 
>>> m.groups 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'groups' 

我想在上面的正則表達式中匹配以下格式的字符串:string1\string2\string3Python不匹配正則表達式

以上是Python的輸出。爲什麼它沒有返回適當的正則表達式對象?我的模式有什麼問題嗎?

+0

作爲一個附註,你可能想'pattern.match(s)',而不是're.match(pattern,s)'。如果您使用(未編譯)字符串作爲模式,則只需要後者。這確實發生了,但沒有記錄。 – abarnert 2013-02-26 20:02:16

+0

更重要的是:'re.match'不返回正則表達式對象。它返回匹配對象(在CPython 2.7中鍵入'_sre.SRE_Match'),如果匹配,則返回'None'(如果沒有匹配)。 – abarnert 2013-02-26 20:03:14

回答

1

的問題是,在你的方式,你可以使用\\\\,代表兩個原始反斜槓,而要匹配的文本,你使用\s,這實際上是在所有(這是一個\s字符)沒有反斜槓。

首先,你可能想讓你的文本成爲一個原始字符串,否則Python將它讀取爲\s字符。

re.match(pattern, r'string1\string2\string3') 

其次,你只需要兩個在你的模式連續斜線,來代表一個反斜槓:

pattern = re.compile(r'(.*)\\(.*)\\(.*)') 

最後,而不是m.groups,你想要做m.groups()(調用方法)。因此,所有在一起您的代碼將如下所示:

pattern = re.compile(r'(.*)\\(.*)\\(.*)') 
m = re.match(pattern, r'string1\string2\string3') 
m.groups() 
# ('string1', 'string2', 'string3') 
+0

謝謝!你如何將包含字符串的變量轉換爲文字字符串? – darksky 2013-02-26 19:59:29

+1

第一部分是錯誤的。 ''\ s''是兩個字符,一個反斜槓和一個s。試試這個:'r'\ s'=='\ s''。這使@ Darksky的問題無關緊要。 (第二部分是這裏的正確答案。) – abarnert 2013-02-26 20:00:29

+0

我沒有輸入字符串。這是一個包含字符串的變量,所以我相信我的問題是相關的:帶有字符串的變量是一個純字符串,而不是一個原始字符串。我正在使用第二部分。我將如何生成 - 如果要使用該字符串?或者避免在這種情況下一起使用原始字符串? – darksky 2013-02-26 20:04:11

1

問題是您正試圖在原始字符串內部轉義反斜槓。從Python docs

當「R」或「R」的前綴是目前,以下反斜槓一個字符包含不變化的串中,且所有反斜槓留在的字符串中。

這意味着所有8個反斜槓會保留在您的正則表達式中,並且每對都與您的測試字符串中的單個反斜槓匹配。問題立即出現when you visualize it(拖動測試字符串上方的滑塊)。它可以通過替換你的正則表達式來修復。

r'(.*)\\(.*)\\(.*)'