From 595b07930a90d3e678a145992d03876182d0ebab Mon Sep 17 00:00:00 2001 From: Laurent Guerard Date: Mon, 14 Sep 2026 15:39:16 +0200 Subject: [PATCH] =?UTF-8?q?feat(strtools):=20=E2=9C=A8=20add=20method=20fo?= =?UTF-8?q?r=20extracting=20text=20between=20brackets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is particularly important for multi series file in OMERO as they are named: file_name.ext [file_name.ext (seriesx)] --- src/imcflibs/strtools.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/imcflibs/strtools.py b/src/imcflibs/strtools.py index d522c460..c7f81417 100644 --- a/src/imcflibs/strtools.py +++ b/src/imcflibs/strtools.py @@ -175,3 +175,33 @@ def pad_number(index, pad_length=2): '0042' """ return str(index).zfill(pad_length) + + +def text_in_last_bracket_group(text): + """Return the content of the last balanced square-bracket group. + + Parameters + ---------- + text : str + The input string to search for the last balanced square-bracket group. + + Returns + ------- + str or None + The content of the last balanced square-bracket group, or None if no such + group exists + """ + depth = 0 + end = None + + for index in range(len(text) - 1, -1, -1): + if text[index] == "]": + if end is None: + end = index + depth += 1 + elif text[index] == "[": + depth -= 1 + if depth == 0: + return text[index + 1 : end] + + return None