在多行中使用正则表达式(DOTALL / MULTILINE)

时间:2014-07-01 14:38:39

标签: python regex

我正在使用python来读取.nk文件,我正在尝试使用正则表达式来搜索文件中的特定项目。

以下是此.nk文件中1个此类项目的示例:

Viewer {
 inputs 2
 frame 1073
 viewerProcess "common"
 input_process false
 name Viewer1
 xpos -8403
 ypos -39859
}

我正在玩这个正则表达式:

viewers = re.findall("(Viewer\s{.*})", TEXT, re.DOTALL)

问题在于它无法停在}符号处。因此,正则表达式在“Viewer \ s {”

之后返回.nk文件中的每一行

我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

你需要告诉Python匹配non-greedily(尽可能少):

viewers = re.findall("(Viewer\s{.*?})", TEXT, re.DOTALL)
#                                 ^

否则,您的模式将捕获文件中第一个Viewer\s{到最后一个}的所有内容。

答案 1 :(得分:2)

iCodez有一个很好的解决方案;另一种可能的方法是通过使用否定的character class明确表示没有大括号可能成为比赛的一部分:

viewers = re.findall(r"(Viewer\s{[^{}]*})", TEXT, re.DOTALL)