Python 什么正则表达式将捕获大括号/圆括号内的多个实例?

Python 什么正则表达式将捕获大括号/圆括号内的多个实例?,python,regex,Python,Regex,如何使用正则表达式捕获(比如)括号内的每一行空格字符\+?例如,在字符串中, “abc和123{foo bar baz}位{yummi tummie}字节。” 我应该在{}中找到四个匹配项,但没有其他匹配项。假设Python语言和字符串内容未知 编辑:还假设没有嵌套的大括号。如果可以使用,则可以使用单个正则表达式。不过,它很复杂,也不可读。但它能正确地处理悬垂的支架 regex模块支持访问捕获组以前的所有匹配项,这对于以下操作至关重要: >>> import regex >

如何使用正则表达式捕获(比如)括号内的每一行空格字符
\+
?例如,在字符串中,
“abc和123{foo bar baz}位{yummi tummie}字节。”
我应该在
{}
中找到四个匹配项,但没有其他匹配项。假设Python语言和字符串内容未知

编辑:还假设没有嵌套的大括号。

如果可以使用,则可以使用单个正则表达式。不过,它很复杂,也不可读。但它能正确地处理悬垂的支架

regex模块支持访问捕获组以前的所有匹配项,这对于以下操作至关重要:

>>> import regex
>>> # The regex behavior version seems to make no difference in this case, so both '(?V0)...' and '(?V1)...' will work.
>>> pattern = r'(?V0)[{]   (?P<u>\s+)?  (?: (?: [^\s}]+ (?P<u>\s+) )*  [^\s}]+ (?P<u>\s+)? )?   [}]'
>>> string = 'abc   and 123 {foo-bar     bar baz } bit {yummi tummie} byte.'
>>> [s for m in regex.finditer(pattern, string, regex.VERBOSE) for s in m.captures('u')]
['     ', ' ', ' ', ' ']
在Python 3.5.1 x64、regex 2016.3.2上测试

  • 我们需要
    r'\{.*.\}'
    中非贪婪地匹配大括号
  • 可以在一行中完成所有操作,但那太长了
  • 我想不出用一个正则表达式就可以完成所有的事情。这似乎是不可能的,因为我们有递归(甚至是左递归):也就是说,一个模式应该在
    {
    和任何数量的
    .w
    s之后匹配。IIRC正则表达式无法处理这个问题,即使“向后看”不需要固定长度的模式
  • 可以检查前面是否有
    }
    而中间没有任何
    {

    \s+(?=[^{]*})
    
    • \s
      是空白字符
      [\t\r\n\f]
      的缩写。请匹配一个或多个

    • (?=[^{]*})
      如果中间有一个
      }
      ,则向前看

    • \s+(?=[^{]*})
      

    不幸的是,这引发了一个错误:
    向后看需要固定宽度模式
    我改进了我的答案以便实际工作。既不优雅也不可读,至少现在是正确的:-)有嵌套的大括号吗?可能有这样的情况:
    abc{abc}a{a}
    abc{a{b}
    ?@gill Nope。没有嵌套的大括号。@诺曼:多个大括号--是的。在您编辑的示例中,匹配四个空格-在第一个大括号中-顺序颠倒了吗?(“foo-bar-bar-baz”之前的“yummi tummie”)?我喜欢这个主意,但OP说的是括号内的单词,但括号内的单词前后都有。@JustMe你说得对。不知道我怎么没读到。会解决的。@只是我哦不。。。OP没有说“在任何单词之后和之前”。但我从另一个角度误解了这个问题。。。修好了。嗯,你是对的;)但OP似乎不太具体——括号中写着“每个空格”,但只有四个空格——而单词之间有五个空格,单词后面还有两个空格,总共是-7。@JustMe我认为OP的意思是“每一次空格字符”,因为预期的匹配数是4。很好,假设没有悬空
    }
    ,只需一个字符就可以把你漂亮的正则表达式括起来。这与
    {}
    对之外的空格相匹配。@bobble啊,对不起,我刚才和gill说的关于“悬空
    }
    ”的话是一样的。
    \s+(?=[^{]*})