【问题标题】:Match text between nested brackets with RegEx in Python在 Python 中使用 RegEx 匹配嵌套括号之间的文本
【发布时间】:2014-09-11 10:08:15
【问题描述】:

我有一个大的 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)

在某些情况下,它不使用第一个和最后一个大括号,例如 { ... } 。如何确保只包含第一个和最后一个大括号之间的文本而不包含其他任何内容?

所需的输出如下所示:

{"link": "some link", "icon": "hello.gif", "name": "Wall Photos", “cmets”:{“count”:0},“updated_time”:“2012-03-12”,“object_id”: "400", "is_published": true, "properties": [{"text": "University", “名称”:“作者”,“href”:“某些链接”}],“来自”:{“id”:“777”,“名称”: “让”},“消息”:“Hello World!:D”,“id”:“id_85”,“created_time”: "2012-03-12", "to": {"data": [{"id": "100", "name": "March"}]}, “message_tags”:{“0”:[{“id”:“100”,“类型”:“用户”,“名称”:“三月”, “长度”:7,“偏移”:0}]},“类型”:“照片”,“标题”:“你好 世界!”}

谢谢!

【问题讨论】:

  • 那些不是括号。
  • 所以您想要从第一个 { 到最后一个 } 的所有内容?其中第一个{ 是前面没有任何其他{ 的那个,最后一个} 是后面没有任何其他} 的那个;对吗?
  • @Scott Hunter:是的,你是对的!
  • 您的 CSV 是否有多个 JSON 类型的条目?
  • 是的,确实如此。我的 CSV 文件中的 JSON 条目并非都属于同一类型。

标签: python regex curly-brackets


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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 字符串,这可能会占用太多 987654326@

    请注意,符号re.search(r'somregex', string)——即在你的正则表达式之前添加一个r——被称为“原始字符串表示法”——这通常用于当你希望反斜杠被逐字处理而不是正则表达式特殊字符时。见here。例如。 r'\n' 匹配两个字符 \n'\n' 匹配换行符

    【讨论】:

      【解决方案3】:

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

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

      应该可以解决问题。即:丢弃所有不是{ 的内容,直到找到第一个,然后将后面的所有内容放入一个组中,直到找到} 之后没有其他}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        • 2011-06-19
        • 1970-01-01
        • 2016-02-18
        • 2019-06-14
        • 2013-11-10
        • 2011-12-15
        相关资源
        最近更新 更多