Python:按特定模式拆分

时间:2013-02-11 14:33:42

标签: 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)

但这给了我:

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

不是我想要的。

4 个答案:

答案 0 :(得分:8)

我更喜欢使用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. 之外的任何内容
  4. \]匹配]

答案 1 :(得分: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执行此操作。因此,(?<=\]),[ ]*也可以。

答案 2 :(得分: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]']

答案 3 :(得分: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]']