【问题标题】:How to pick useful information within curly braces from a text file using a python script?如何使用 python 脚本从文本文件中选择大括号内的有用信息?
【发布时间】:2021-09-09 21:24:05
【问题描述】:

我有一个巨大的文本文件,其中包含以这种格式存储的信息。

someOtherMessage{
              class = "someClass";
      sampleMessage{
                  someValue{
                      someText{
                          someParam = "value";
                          someSymbol = "another_symbol";
                      }; //someText
                  }; //someValue
       }; //sampleMessage
    }; //someOtherMessage

someOtherMessage2{
              class = "someClass2";
      sampleMessage2{
                  someValue2{
                      someText2{
                          someParam = "value2";
                          someSymbol = "another_symbol2";
                      }; //someText2
                  }; //someValue2
       }; //sampleMessage2
    }; //someOtherMessage2

我想使用 py 脚本遍历这个文件,并以以下格式构建一个 dict(或任何其他数据结构)。

例如。

dict = {'someOtherMessage': 'someOtherMessage{
              class = "someClass";
      sampleMessage{
                  someValue{
                      someText{
                          someParam = "value";
                          someSymbol = "another_symbol";
                      }; //someText
                  }; //someValue
       }; //sampleMessage
    }; //someOtherMessage',

'someOtherMessage2': 'someOtherMessage2{
          class = "someClass2";
  sampleMessage2{
              someValue2{
                  someText2{
                      someParam = "value2";
                      someSymbol = "another_symbol2";
                  }; //someText2
              }; //someValue2
   }; //sampleMessage2
}; //someOtherMessage2'
}

我使用了以下正则表达式,但它选择了第一个和最后一个花括号之间的所有内容,我怎样才能让它分别选择所需的?

r"(?s){(.*)}"

【问题讨论】:

  • 会不会一直有那个'}; //someOtherMessage\nsomeOtherMessage2{' 你想要的任意两部分之间的新行?
  • @AKSingh,是的,实际上也可以有多个新行!
  • (?s)\{(.*?)\};.*?(\n\n|$)^$ 匹配每一行的结尾处试试这个。简单来说,不要加m修饰符。
  • @AKSingh,检查this
  • 请删除m 修饰符。试试regex101.com/r/1T7Bey/1

标签: python regex string file-handling string-matching


【解决方案1】:

这是解决您的问题的一种可能方法。 我假设你知道贪婪和懒惰的量词。如果没有,这里有一个链接:Greedy vs. Reluctant vs. Possessive Qualifiers

(?s)\{(.*?)\};.*?(\n\n|$)

错误

在原始正则表达式(?s){(.*)} 中,您使用了匹配太多的贪婪量词,因此导致匹配我们不想要的东西。

如果你用 惰性量词(?s){(.*?)} 替换它,它匹配的太少,这又会导致匹配不想要的东西。


更正

为了指定更正结尾 },我们必须找到一些东西来锚定我们的匹配。这就是要获取的数据之间的那些新线发挥作用的地方。

    }; //someOtherMessage

someOtherMessage2{

someOtherMessage 注释之后有一个\n,然后在新行中还有另一个\n。所以我们添加

`(?s)\{(.*?)\};.*?\n\n`

这只是意味着{...something here...}...something here...\n\n

这个正则表达式仍然不是结束数据,因为它最后没有任何\n

}; //someOtherMessage2'
}

所以为了匹配它,我们通过删除 m 修饰符将$ 设置为匹配文件结尾。这会将我们的正则表达式更改为:

 (?s)\{(.*?)\};.*?(\n\n|$)

我希望我已经帮助你解决了你的问题。请注意,这是解决您的问题的可能方法之一。 还有另一种查找匹配嵌套括号的方法,该方法也可用于 SO。但是,它可能有点复杂。这是一个这样的链接:Can regular expressions be used to match nested patterns?

如果您有任何其他疑问,请务必提及。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2016-04-05
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多