我有以下字符串:
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正则表达式不接受原子组?(