Python正则表达式与=的混淆

时间:2015-04-20 22:41:35

标签: python regex

我尝试替换以捕获以下内容中的\n\n

然而,当我尝试:

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

我回来了None

如果我这样做:

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

我会得到一场比赛。

为什么额外的===...会阻止我匹配?

2 个答案:

答案 0 :(得分:3)

默认情况下,.与换行符不匹配。见here

  

(点。)在默认模式下,它匹配除换行符之外的任何字符。如果指定了DOTALL标志,则匹配包括换行符在内的任何字符。

因此,要解决此问题,请添加re.DOTALL标志:

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

答案 1 :(得分:1)

如果您尝试匹配换行符,请尝试

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

由于*贪婪,如果您使用的是.,它会在=之后尽可能多地与\n匹配。 \n如果您使用re.DOTALL允许它匹配\n。因为你显然只想匹配\ n \ n,这不是你想要的。

请注意,您可以通过指定要匹配的=的数量来使其更紧凑:

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以匹配任何空格。