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| '
假设文本
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| '