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

2024-04-25 22:52:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我如何使用regex来捕获括号内的每一个空格字符\ +?例如,在字符串中, "abc and 123 {foo-bar bar baz } bit {yummi tummie} byte." 我应该在{}中找到四个匹配项,但没有其他匹配项。假设Python语言并且字符串内容未知。在

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


Tags: and字符串语言foobitbarbazbyte
3条回答

如果您可以使用alternate regex module,那么您可以使用单个regex来实现它。不过,它很复杂,不可读。但它能正确处理悬垂的牙套。在

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')]
['     ', ' ', ' ', ' ']

简单地说,这个regex查找格式为'{' blanks? ((nonblanks blanks)* nonblanks blanks?)? '}'的匹配项,并将所有空白部分分配给名为u(?P<u>...))的同一个捕获组。在

它还可以处理包含不匹配的{}的字符串:

^{pr2}$

在Python 3.5.1 x64、regex 2016.3.2上测试。

A lookahead可以检查前面是否有},中间没有{。在

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

  • 如果(?=[^{]*})之间有一个}和任何{a4}之间,则(?=[^{]*})会向前看。

Demo at regex101

>>> s = 'abc   and 123 {foo-bar     bar baz } bit {yummi tummie} byte.'
>>> inside_braces = re.findall(r'\{.*?\}', s)
>>> spaces_inside_braces = [re.findall(r' +', match) for match in inside_braces]
>>> [match for mlist in spaces_inside_braces for match in mlist]  # flatten list
['     ', ' ', ' ', ' ']
  1. 我们需要r'\{.*?\}'中的?来不贪婪地匹配大括号。在
  2. 可以在一行中完成所有的任务,但那太长了。在
  3. 我想不出只有一个正则表达式就可以实现所有这些。这似乎是不可能的,因为我们有递归(甚至左递归):也就是说,一个模式应该在{和{}s的任何一个匹配。IIRC regex不能处理这个问题,即使look-behind不需要固定长度的模式。在

相关问题 更多 >