Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python提取第一个和最后一个卷曲括号之间的所有文本,包括文本中间的其他卷曲括号。_Python_Regex - Fatal编程技术网

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之后为空,则此代码仅在
产生
时有效。谢谢您的观察。我已编辑了我的帖子。