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+(?=[^{]*})