我尝试替换以捕获以下内容中的\n\n
:
然而,当我尝试:
re.search('=============== K # 1 ===============(.*)=====================',
'=============== K # 1 ===============\n\n==================================================')
我回来了None
。
如果我这样做:
re.search('=============== K # 1 ===============(.*)',
'=============== K # 1 ===============\n\n==================================================')
我会得到一场比赛。
为什么额外的===...
会阻止我匹配?
答案 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
以匹配任何空格。