Python提取第一个和最后一个卷曲括号之间的所有文本,包括文本中间的其他卷曲括号。
我有以下字符串:Python提取第一个和最后一个卷曲括号之间的所有文本,包括文本中间的其他卷曲括号。,python,regex,Python,Regex,我有以下字符串: str1 = """ {'name': 'apple', 'description': 'red {03} … bright'}, {'name': 'banana', 'description': 'yello {153} not fresh'} """ 所需输出是一个包含以下两个元素的列表: ["{'name': 'apple', 'description': 'red {03} … bright'}&
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}"]
它没有捕获文本中间的卷曲括号之后的文本。我想<强>捕获所有文本之间的第一个和最后一个卷曲括号,包括其他卷曲括号中间的文字< /强>。你们有什么建议吗?
试着用大括号“()”表示数字的内部值,比如:str1=”“” {'name':'apple','description':'red(03)…bright'},{'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'}"]
>>>
["{'name': 'apple', 'description': 'red {03} … bright'}", "{'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_堆栈
在项目弹出后为空,我们知道我们不是指嵌套结构
输出:
['{03}', "{'name': 'apple', 'description': 'red {03} … bright'}", '{153}', "{'name': 'banana', 'description': 'yello {153} not fresh'}"]
>>>
["{'name': 'apple', 'description': 'red {03} … bright'}", "{'name': 'banana', 'description': 'yello {153} not fresh'}"]
>>>
{.*?}(?(?>[^',]*?'))
(?!(?>[^',]*?')
:它接受(量词)的多个字符与}
字符匹配,然后出现一个引号”
(很抱歉,也许您的python正则表达式不接受原子组?这似乎不是,也就是说,可以用正则表达式来描述。具体来说,
S=A*“{”S“}”A*
形式的表达式(即,包含平衡圆括号的平衡圆括号)是不规则的。请注意,对于某些特定输入,可能存在“欺骗”,例如在}、\w{
上拆分(记录之间的逗号空格分隔)。但是,这需要知道所有可能的对抗性输入以避免冲突–例如,它不适用于“{”name:“{ap},{ple}”。请您的问题提供不应拆分的输入的详细信息。理想情况下,请澄清您(认为您)是否/为什么必须使用re.findall(r)…,str1)
用于此。很抱歉,我不想在这种情况下更改任何文本。如果堆栈在.pop
@MisterMiyagi之后为空,则此代码仅在产生
时有效。谢谢您的观察。我已编辑了我的帖子。