1

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

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)

没有成功:(。

谢谢!

4

2 回答 2

8

不,您的角色类别是正确的。它将匹配任何不是的字符}(甚至换行符)。问题是[^}]只匹配一个字符。只需使用重复量词(您可能应该转义{):

r"\{[^}]*"

关于您尝试过的选项。如果有任何re.S帮助,因为没有它.不匹配换行符。但这.确实是唯一受到影响的东西re.S。另一个选项re.M与它无关。这只会使锚点^$匹配线的开始和结束。

此外,由于您只想要括号内的内容,因此您不需要匹配{本身,但您可以使用后向查找:

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

这将不包括{在比赛中。

于 2012-10-30T14:31:41.517 回答
2

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

您的正则表达式缺少 }指定在哪里结束匹配以及.*?匹配 0 到多个字符直到它匹配第一个}

于 2012-10-30T14:33:26.483 回答