2015-04-20 93 views
0

我試圖取代捕捉在下面的內容中\n\nPython的正則表達式混淆=

然而,當我嘗試:

re.search('=============== K # 1 ===============(.*)=====================', 
    '=============== K # 1 ===============\n\n==================================================') 

我回去None

如果我做的:

re.search('=============== K # 1 ===============(.*)', 
    '=============== K # 1 ===============\n\n==================================================') 

我會得到一個匹配。

爲什麼額外的===...阻止我匹配?

回答

1

如果你想匹配換行,儘量

re.search('=============== K # 1 ===============(\n*)=====================', 
'=============== K # 1 ===============\n\n==================================================') 

由於*是貪婪的,如果你正在使用.,它將\n S作爲匹配後儘可能多的= S的,因爲它可以以及如果您使用re.DOTALL以允許其匹配\n,那麼就是\n。正如你顯然只想匹配\ n \ n,這不是你想要的。

注意,可以讓這個更緊湊通過指定的= S上的號碼要匹配:

re.search('={15} K # 1 ={15}(\n*)={21}', 
'=============== K # 1 ===============\n\n==================================================') 

要使用.說明問題:

In [7]: s = '=============== K # 1 ===============\n\n==================================================' 

In [8]: re.search('={15} K # 1 ={15}(.*)={21}', s, re.DOTALL).groups() 
Out[8]: ('\n\n=============================',) 

In [9]: re.search('={15} K # 1 ={15}(\n*)={21}', s).groups() 
Out[9]: ('\n\n',) 

或者,你可以使用[^=]來匹配任何非'='或\s以匹配任何空格。

3

默認情況下,.與換行符不匹配。請參閱here

(點)。在默認模式下,它匹配除換行符以外的任何字符。如果已經指定了DOTALL標誌,則它匹配包括換行符的任何字符。

因此,爲了解決這個問題,re.DOTALL標誌添加:

re.search('=============== K # 1 ===============(.*)=====================', 
      '=============== K # 1 ===============\n\n==================================================', 
      re.DOTALL) 
+0

雖然這將工作時,它返回匹配將包括'='S IN除了某些號碼到'\ n \ n 「他試圖匹配,如果應用於更大的字符串,可能會匹配更多。 – cge