2013-02-11 42 views
1

我有以下的Python:拆分某些模式

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

不是真的我想要的。

+0

'eval('['+ str +']')'如果它來自可信來源。 – nhahtdh 2013-02-11 14:35:30

+1

你最終想達到什麼目的? – nhahtdh 2013-02-11 14:40:04

+0

我的問題中的第二行代碼。這就是我想要的。 – wnstnsmth 2013-02-11 14:43:46

回答

6

我更喜歡使用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. \]比賽]
+0

接受簡單,並指向我re.findall()。 – wnstnsmth 2013-02-11 14:48:53

+2

或者,也可以使用非貪婪版本:'r「\ [。*?\]」'來代替X-then-any-but-Y-then-Y模式。 – DSM 2013-02-11 14:52:26

2

您需要使用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做到這一點。所以,(?<=\]),[ ]*也將工作。

+0

爲什麼不只是'r「(?<= \)),」'? – mgilson 2013-02-11 14:40:30

+0

@mgilson。是的,他們都沒有實際需要。 – 2013-02-11 14:42:45

+1

雖然我確實認爲匹配逗號周圍的空格是必要的,以防止它出現在輸出中 - 雖然我通常會回退到\ s *'而不是'[] *' - 但這一切都取決於你想匹配我想。 – mgilson 2013-02-11 14:44:40

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