2015-04-20 60 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