介绍
什么是Python多行匹配模式?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>问题强>
你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。
<强>解决方案强>
这个问题很典型的出现在当你用点(.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符的事实。比如,假设你想试着去匹配C语言分割的注释:
在祝辞祝辞评论=re.compile (" # 39;/\ * (. * ?) \ */& # 39;)
在祝辞祝辞text1=& # 39;/*这是一个注释*/& # 39;
在祝辞祝辞text2=& # 39; & # 39; & # 39;/*这是一个
…多行注释*/
…& # 39;& # 39;& # 39;
在祝辞祝辞
在祝辞祝辞comment.findall (text1)
[& # 39;这是一个评论& # 39;]
在祝辞祝辞comment.findall (text2)
[]
在祝辞祝辞
为了修正这个问题,你可以修改模式字符串,增加对换行的支持。比如:
在祝辞祝辞评论=re.compile (" # 39;/\ * ((?: | \ n) * ?) \ */& # 39;)
在祝辞祝辞comment.findall (text2)
[& # 39;这是一个\ n多行注释& # 39;]
在祝辞祝辞
在这个模式中,(?:| \ n)指定了一个非捕获组(也就是它定义了一个仅仅用来做匹配,而不能通过单独捕获或者编号的组)。
<强>讨论强>
<代码> re.compile() 代码>函数接受一个标志参数叫<代码> re.DOTALL> 代码,在这里非常有用。它可以让正则表达式中的。匹配包括换行符在内的任意字符。比如:
在祝辞祝辞评论=re.compile (" # 39;/\ * (. * ?) \ */& # 39;, re.DOTALL)
在祝辞祝辞comment.findall (text2)
[& # 39;这是一个\ n多行注释& # 39;]
对于简单的情况使用<代码> re.DOTALL> 代码标记参数工作的很好,但是如果模式非常复杂或者是为了构造字符串令牌而将多个模式合并起来(2.18节有详细描述),这时候使用这个标记参数就可能出现一些问题。如果让你选择的话,最好还是定义自己的正则表达式模式,这样它可以在不需要额外的标记参数下也能工作的很好。