python提取第一个和最后一个花括号之间的所有文本,包括文本中间的其他花括号



我有以下字符串

str1 = """
{'name': 'apple', 'description': 'red {03} … bright'}, {'name': 'banana', 'description': 'yello {153} not fresh'}
"""

所需的输出是一个包含以下两个元素的列表:

["{'name': 'apple', 'description': 'red {03} … bright'}", "{'name': 'banana', 'description': 'yello {153} not fresh'}"]

我用re.findall(r"{.*?}",str1(进行了尝试,但我得到了以下结果:

["{'name': 'apple', 'description': 'red {03}",
"{'name': 'banana', 'description': 'yello {153}"]

它没有捕获文本中间花括号之后的文本。我想捕获第一个和最后一个花括号之间的所有文本,包括文本中间的其他花括号。你们有什么建议吗?

好吧,您可以手动解析字符串。将左大括号推到堆栈上,当你看到右大括号时弹出,并在两者之间屈服。

def parse(content):
pairs = {
"{": "}"
}
open_stack = []
for index, char in enumerate(content):
if char in pairs:
open_stack.append((char, index))
elif open_stack and pairs[open_stack[-1][0]] == char:
popped = open_stack.pop()
yield content[popped[1]:index+1]
content = "{'name': 'apple', 'description': 'red {03} … bright'}, {'name': 'banana', 'description': 'yello {153} not fresh'}"
print(list(parse(content)))

输出:

['{03}', "{'name': 'apple', 'description': 'red {03} … bright'}", '{153}', "{'name': 'banana', 'description': 'yello {153} not fresh'}"]
>>> 

不过这并不理想。如您所见,它还生成{03}{153}。使用此解决方案,您将不得不挑选您想要的特定生成子字符串,而不是粉丝。


EDIT-@MisterMyagi观察到,只要对原始代码稍作更改,parse生成器就可以产生所需的输出:

def parse(content):
pairs = {
"{": "}"
}
open_stack = []
for index, char in enumerate(content):
if char in pairs:
open_stack.append((char, index))
elif open_stack and pairs[open_stack[-1][0]] == char:
popped = open_stack.pop()
if not open_stack:
yield content[popped[1]:index+1]

具体来说,如果open_stack在弹出一个项后为空,我们就知道我们指的不是嵌套结构。

输出:

["{'name': 'apple', 'description': 'red {03} … bright'}", "{'name': 'banana', 'description': 'yello {153} not fresh'}"]
>>> 

试着在值内使用花括号"(("表示麻木,类似于:str1="quot"{‘name’:"apple","description":"red(03(…bright"},{‘name':"banana","description":"yello(153(not fresh"}"quot">

{.*?}(?!(?>[^',]*?'))

(?!(?>[^',]*?')):它接受(量词(的多个字符与}字符匹配,然后出现单引号'

(很抱歉,也许您的python正则表达式不接受原子组?(

相关内容

最新更新