Python正则表达式匹配,直到多行的字符

时间:2012-10-30 14:30:31

标签: python regex python-2.7 newline

我有一个格式如下的文件:

hello = {

     a = "2354a"
     b = "06567567h"


}

goodbye = {
     there = "/home/afhge"

}

...

anotherset = {
      dsfsdf = grhbrwecs
      dfgtmyj = 12345

}

我在python中使用正则表达式,我想要匹配的是大括号内的所有内容,因此得到的匹配输出将是以下列表:

['\n\n\ta = "2345a"\n\tb = "06567567h"\n\n\n', '\n\there = "/home/afhge"\n\n', '\n\tdsfsdf = grhbrwecs\n\tdfgtmyj = 12345\n\n']

我试过了正则表达式:

desired_output = re.findall("{[^}]", file_text)

然而这个正则表达式导致列表:

['{\n', '{\n', '{\n', '{\n', '{\n']

看起来[^}]匹配任何字符直到换行符。我试过了:

desired_output = re.findall("{[^}]", file_text, re.S)

desired_output  = re.findall("{[^}]", file_text, re.M)

没有成功:(。

谢谢!

2 个答案:

答案 0 :(得分:8)

没有你的角色类是对的。它将匹配任何不是}的字符(甚至换行符)。问题是[^}]只匹配一个字符。只需使用重复量词(你应该逃避{):

r"\{[^}]*"

关于您尝试过的选项。如果有任何re.S会有所帮助,因为没有它.与换行符不匹配。但是.实际上是唯一受re.S影响的事情。另一个选项re.M与之无关。这只会使锚点^$在行的开头和结尾处匹配。

此外,由于您只需要括号内的内容,因此您无需匹配{本身,但您可以使用lookbehind:

r"(?<=\{)[^}]*"

这不包括匹配中的{

答案 1 :(得分:2)

您应该使用(?<={).*?(?=})

您的正则表达式缺失 }指定匹配结束位置,.*?匹配0到多个字符,直到匹配第一个}

相关问题