regex 将嵌套列表的字符串表示拆分为子列表的字符串表示

oaxa6hgo  于 2023-03-13  发布在  其他
关注(0)|答案(4)|浏览(115)

我有以下内容:

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

jrcvhitl1#

我更喜欢使用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. \]匹配项]
njthzxwz

njthzxwz2#

您需要将re.splitlook-ahead 一起使用:

>>> 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来做,所以(?<=\]),[ ]*也可以。

gg58donl

gg58donl3#

这是我写的一个简单的程序,我认为它解决了你的问题,但不是最好的。

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

liwlm1x94#

以下来自@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]']

相关问题