繁体   English   中英

使用Python中的RegEx匹配嵌套括号之间的文本

[英]Match text between nested brackets with RegEx in Python

我有一个很大的CSV文件,其中的一行类似于以下内容:

id_85,
{
    "link": "some link",
    "icon": "hello.gif",
    "name": "Wall Photos",
    "comments": {
        "count": 0
    },
    "updated_time": "2012-03-12",
    "object_id": "400",
    "is_published": true,
    "properties": [
        {
            "text": "University",
            "name": "By",
            "href": "some link"
        }
    ],
    "from": {
        "id": "7778",
        "name": "Let"
    },
    "message": "Hello World! :D",
    "id": "id_85",
    "created_time": "2012-03-12",
    "to": {
        "data": [
            {
                "id": "100",
                "name": "March"
            }
        ]
    },
    "message_tags": {
        "0": [
            {
                "id": "100",
                "type": "user",
                "name": "Marcelo",
                "length": 7,
                "offset": 0
            }
        ]
    },
    "type": "photo",
    "caption": "Hello world!"
}

我正在尝试只在第一个和结尾大括号之间获取它的json部分。

下面是到目前为止我的python正则表达式代码

import re 
str = "id_85,{"link": "some link", "icon": "hello.gif", "name": "Wall Photos", "comments": {"count": 0}, "updated_time": "2012-03-12", "object_id": "400", "is_published": true, "properties": [{"text": "University", "name": "By", "href": "some link"}], "from": {"id": "777", "name": "Let"}, "message": "Hello World! :D", "id": "id_85", "created_time": "2012-03-12", "to": {"data": [{"id": "100", "name": "March"}]}, "message_tags": {"0": [{"id": "100", "type": "user", "name": "March", "length": 7, "offset": 0}]}, "type": "photo", "caption": "Hello world!"} "
m = re.match(r'.*,({.*}$)', str)
if m:
     print m.group(1)

在某些情况下,它不需要第一个和最后一个大括号,例如{{}}。 如何确保仅包括第一个和最后一个大括号之间的文本,而不包括其他任何文本?

所需的输出如下所示:

{“链接”:“某些链接”,“图标”:“ hello.gif”,“名称”:“墙照片”,“评论”:{“计数”:0},“ updated_time”:“ 2012-03- 12“,” object_id“:” 400“,” is_published“:true,” properties“:[{” text“:” University“,” name“:” By“,” href“:” some link“}]], “ from”:{“ id”:“ 777”,“ name”:“ Let”},“ message”:“ Hello World!:D”,“ id”:“ id_85”,“ created_time”:“ 2012-03 -12“,”至“:{”数据“:[{” id“:” 100“,”名称“:”三月“}]}},” message_tags“:{” 0“:[{” id“:” 100”,“类型”:“用户”,“名称”:“ 3月”,“长度”:7,“偏移量”:0}]},“类型”:“照片”,“字幕”:“ Hello world! “}

谢谢!

这将与第一个逗号之后的整个json部分匹配。 不确定这是否是您想要的。 所需输出的示例将很有帮助。

re.match(r'[^,]*,(.*)', s).group(1)

我相信这是可行的,因为在这种情况下.*是“贪婪的”:

import re
str = 'id_85,{"link": "some link", "icon": "hello.gif", "name": "Wall Photos", "comments": {"count": 0}, "updated_time": "2012-03-12", "object_id": "400", "is_published": true, "properties": [{"text": "University", "name": "By", "href": "some link"}], "from": {"id": "777", "name": "Let"}, "message": "Hello World! :D", "id": "id_85", "created_time": "2012-03-12", "to": {"data": [{"id": "100", "name": "March"}]}, "message_tags": {"0": [{"id": "100", "type": "user", "name": "March", "length": 7, "offset": 0}]}, "type": "photo", "caption": "Hello world!"} '
m = re.search('({.*})', str)
if m:
    print m.group(0)

如果您的CSV中还有其他JSON字符串,则可能会抓取太多 ,即会太贪心,因为最后}将与str最后出现的}匹配

请注意,符号re.search(r'somregex', string) -即在您的正则表达式之前添加r被称为“原始字符串符号”-通常在您希望将反斜杠按字面意义而不是正则表达式使用时使用特殊的角色。 这里 例如r'\\n'匹配两个字符\\n'\\n'匹配换行符

假设(如最初发布的那样)CSV中的每一行都有1个JSON元素,则

re.match(r'^[^{]*({.*})[^}]*$',str).group(1)

应该可以。 那就是:将所有不是{东西丢弃,直到找到第一个{ } ,然后将后面的所有东西放入,直到您击中一个}之后再没有其他}为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM