Python:只包含第一个括号的子集字符串,但包含多个

Python: Subset strings solely of the first bracket that opens up, but contains multiple

假设文本

text = """{ |p{3cm}|p{3cm}|p{3cm}| } \hline \multi{3}{|c|}{城市列表} \ \hline 名称 .. ."""

我只想对第一个大括号的内容进行子集化。 所以期望的输出是:

desired_output = "p{3cm}|p{3cm}|p{3cm}"

目前我收到所有花括号的内容



text = """{ |p{3cm}|p{3cm}|p{3cm}|  } \hline \multi{3}{|c|}{City List} \ \hline Name ... """
import re
false_output = re.findall(r'\{(.*?)\}',text)
false_output

#[' |p{3cm', '3cm', '3cm', '3', '|c|', 'City List']


#also no success with: 
re.findall(r'({\w+\})',a) 

我认为这不能用正则表达式来完成。上次我不得不处理这样的事情(解析 wikitext),我最终使用了一个堆栈,每次我有开始字符时增加,当我遇到结束字符时减少,当我找到最后一个时退出。

请注意,这不适用于重复的一级括号。

代码比这更优化,但基本思路如下:

def keep_between(text, start, end):
    counter = 0
    result = []
    beginning = text.find(start)
    if beginning != -1:
        remaining_text = text[beginning:]
        for c in remaining_text:
            if c == start:
                counter += 1
                continue
            if c == end:
                counter -= 1
                continue
            if not counter:
                break
            result.append(c)
    return ''.join(result)

print(keep_between(text, '{', '}'))

这让我很感动 ' |p3cm|p3cm|p3cm| '