找出一个字符串中两边只有一个括号的所有子串

Find all the substrings in a string that only have a single bracket on both sides

我试图在一个字符串中找到两边只有一个括号的所有子字符串。

示例:'(pop((hello world))(goodbye(now))(hi)jump)'

我想得到这个列表:['(hi)', '(pop((hello world))(goodbye(now))(hi)jump)'] 因为它们是唯一两边都有一个括号的子串。

(像 '(now))(hi)jump)' 这样的子字符串不计算在内,因为它们不完整).

我的代码在这里:

import re
l = '(M264/M274)+(((551/882)+362/(362/551/882)+889)/((551/882)+362/(362/551/882)+889)+(241/242/275/550/551+882/889/362))'
print(re.findall(r"[^\(.](\([^\(.].*?[^\).]\))[^\).]", l))

将return:

['(362/551/882)', '(362/551/882)']

我不确定如何让它包含 (M264/M274)。 请帮助我。

使用否定字符 class,如 [^\(.][^\).] 匹配字符 class 中未列出的任何字符,并且至少需要一个字符。这部分 。*?可以匹配除换行符以外的任何字符,所以它也可以匹配括号。

它不考虑平衡括号,但如果您想像问题中那样匹配 (M264/M274),您可以将环视与 negated character class

结合使用
(?<!\()\([^()]+\)(?!\))

部分

  • (?<!\() 负向后视,断言左边的不是 (
  • \( 匹配 (
  • [^()]+ 匹配除 ()
  • 之外的任何字符
  • \) 匹配 )
  • (?!\)) 否定前瞻,断言右边不是`)

Regex demo

如果你想匹配 2 个左括号和右括号,你也可以使用 lookarounds 并注意这也没有考虑平衡括号。

(?<!\()\(\((?!\().*?\)\)(?<!\)..)(?!\))

部分(使用相同的机制或环顾四周,只是这次使用 .*?

  • (?<!\() 负向后视,断言左边的不是 (
  • \(\( 匹配 ((
  • (?!\)) 否定前瞻,断言右边不是`)
  • .*? 匹配除换行符以外的任何字符 0+ 次
  • \)\) 匹配 ))
  • (?<!\)..) 否定后视,在 ))
  • 之前断言不是 )
  • (?!\)) 否定前瞻,断言右边不是`)

Regex demo