2

我有以下

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]']

不是我想要的。

4

4 回答 4

9

我更喜欢使用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]']
  1. \[火柴 [
  2. [^\]]*匹配除 ] 以外的任何内容
  3. \]火柴 ]
于 2013-02-11T14:36:58.937 回答
3

您需要re.split使用前瞻

>>> s = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'

>>> re.split(",[ ]*(?=\[)", s)
['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']

并且不要str用作变量。它是内置的阴影。

下面的图案:

,[ ]*(?=\[)

将匹配comma(,)和 一些空格,然后是[

您甚至可以使用look-behind. 所以,(?<=\]),[ ]*也会起作用。

于 2013-02-11T14:37:08.327 回答
0

这是我写的一个幼稚的程序,我认为它可以解决您的问题,但不是最好的。

>>>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]']
于 2013-02-11T15:03:12.447 回答
0

继@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]']
于 2013-02-11T15:31:18.477 回答