2013-05-12 170 views
1

這只是爲了學習的目的,我有下面的代碼。如果我想提取只是'abcbc'與雙引號?我也試過re.search(r'\A\"(.*?)\"',a).group()注意到變化。提取字符串內出雙引號

>>> a = "\"abcbc\" lol" 
>>> re.search(r'\A"(.*?)"',a).group() 
'"abcbc"' 

如果我將模式更改爲'\A"(.*?)'這應該只是在雙引號後返回所有內容?但它給出了以下內容。有什麼我錯了嗎?

>>> re.search(r'\A"(.*?)',a).group() 
'"' 

回答

3

您捕捉你在一組想要的東西,但通過調用group()不帶參數,你正在返回整個匹配(組0),而不是你想要的組(這是第1組)。致電.group(1)返回第一組,它具有你想要的。

>>> a = "\"abcbc\" lol" 
>>> re.search(r'\A"(.*?)"',a).group(1) 
'abcbc' 

關於你的第二個問題,*?是非貪婪的:它會少,因爲它可以匹配。由於*允許匹配零,所以*?將不匹配,如果它可以---也可以,因爲你沒有任何東西來強制匹配到某個點。隨着後面的報價,它將匹配儘可能少的匹配下一個報價,這將迫使它繼續消耗文本,直到它達到近似報價。但沒有引用,它只是沒有匹配,因爲它沒有理由繼續匹配。

如果使用非貪婪的一個,它會的確是一個雙引號後的雙引號匹配之後一切--- 一切,到行的末尾:

>>> re.search(r'\A"(.*)',a).group() 
'"abcbc" lol' 
+0

我想' \「([^」] *)'當然也會這樣做('group(1)')。 – gillyspy 2013-05-13 04:03:24