【问题标题】:Python regex match until character over multiple lines [duplicate]Python正则表达式匹配直到多行字符[重复]
【发布时间】:2012-10-30 14:30:30
【问题描述】:

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

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)

没有成功:(。

谢谢!

【问题讨论】:

    标签: python regex python-2.7 newline


    【解决方案1】:

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

    r"\{[^}]*"
    

    关于您尝试过的选项。如果有什么re.S 会有所帮助,因为没有它. 不匹配换行符。但是. 确实是唯一受re.S 影响的东西。另一个选项re.M 与它无关。这只会使锚点 ^$ 在行首和行尾匹配。

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

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

    这将不包括匹配中的{

    【讨论】:

    • 这很棒,谢谢!至于在比赛中不包括 { 我只是在我想要显示的代码周围加上括号。我的新正则表达式:“\{([^\}]*)”
    • @m3hughes 是的,这是另一种可能性。
    【解决方案2】:

    你应该使用(?&lt;={).*?(?=})

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

    【讨论】:

    • 有效,但我将验证提供给 m.buettner 的答案,因为它有更多关于 re.S 和 re.M 的详细信息,这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2021-10-22
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2020-06-03
    • 1970-01-01
    相关资源
    最近更新 更多