Python:按特定模式拆分

Python:按特定模式拆分,python,regex,split,Python,Regex,Split,我有以下几点 str = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]' 我想拆分它,这样我就有了一个字符串数组,比如 ['[5.955894,45.817792],'[10.49238,45.817792],…] 因此[…]对象是数组的元素。重要的是要包括封闭的[和]。我已经走了这么远: re.split('\D,\s\D', str) 但这给了我: [

我有以下几点

str = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
我想拆分它,这样我就有了一个字符串数组,比如

['[5.955894,45.817792],'[10.49238,45.817792],…]

因此[…]对象是数组的元素。重要的是要包括封闭的[和]。我已经走了这么远:

re.split('\D,\s\D', str)
但这给了我:

['[5.955894, 45.817792', '10.49238, 45.817792', '10.49238, 47.808381', '5.955894, 47.808381]']

不是我想要的

我更喜欢使用
re.findall
并指定我想要的内容,而不是试图描述
re.split

>>> s = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
>>> re.findall(r"\[[^\]]*\]",s)
['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']
  • \[
    匹配[
  • [^\]]*
    匹配任何内容,但不匹配]
  • \]
    匹配]

  • 您需要使用带有前瞻性的
    re.split

    不要使用
    str
    作为变量。它是内置的

    以下模式:

    ,[ ]*(?=\[)
    
    将匹配
    逗号(,)
    和一些空格,后跟
    [


    你甚至可以用
    look behind
    来做这件事。所以,
    (?这是我写的一个简单的程序,我认为它解决了你的问题,但不是最好的

    >>>def split_string(strg, begin = '[', end = ']'):  
        myList = []  
        string = ''  
        for char in strg:  
            if char == begin:  
                string = ''  
            string += char  
            if char == end:  
                myList.append(string)  
        return myList  
    >>>strg = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'  
    >>>split_string(strg)  
    ['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']
    

    以下是@nhahtdh评论

    取决于你的信任问题

    In [510]: txt = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
    
    In [511]: lst = eval ("[%s]" % txt)
    
    In [512]: [str(x) for x in lst]
    Out[512]:
    ['[5.955894, 45.817792]',
     '[10.49238, 45.817792]',
     '[10.49238, 47.808381]',
     '[5.955894, 47.808381]']
    

    eval('['+str+']'))
    如果它来自可靠的来源。你最终想要实现什么?我问题中的第二行代码。这就是我想要的。@nhahdh--
    eval
    不会给出OP想要的,但是作为一个补充,有一个
    ast.literal\u eval
    可以做与
    eval
    相同的事情,没有安全隐患。为什么不呢st
    r”(?@mgilson。是的,它们实际上都不是必需的。虽然我确实认为匹配逗号周围的空格是必要的,以防止它出现在输出中——尽管我通常会使用
    \s*
    而不是
    []*
    --但我想这一切都取决于你想匹配什么。@mgilson..好吧,如果可以有任何其他类型的空格,比如制表符或换行符,而不仅仅是
    空格,那么就需要
    \s
    了。但这也取决于OP,他想要什么。或者,你可以使用使用非贪婪版本:
    r“\[.*?\]”
    In [510]: txt = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
    
    In [511]: lst = eval ("[%s]" % txt)
    
    In [512]: [str(x) for x in lst]
    Out[512]:
    ['[5.955894, 45.817792]',
     '[10.49238, 45.817792]',
     '[10.49238, 47.808381]',
     '[5.955894, 47.808381]']