2013-03-05 91 views
1

我有一個字符串,我需要解析蟒蛇正則表達式:下面是示例字符串:複雜的列表和整數組合

sample_string = "([0, 22, 23, 24, 25, 47, 59],36155), ([0, 1, 22, 23, 24, 25, 47, 59, 7],36154), ([0, 1, 22, 23, 24, 25, 47, 50, 59, 7],36153)" 

我試過以下的正則表達式,但似乎並沒有得到它的權利:

\((\[[(\d)+][,?])+\]),(\d)+\) 

正則表達式的目的很容易訪問元組的列表部分以及元組的整數部分。最簡單的方法是使用ast.literal_eavl(sample_string),但想知道爲什麼上述正則表達式無法正確解析它?

+0

如果'sample_string'是一個字符串,爲什麼它不在引號中?正則表達式有很多問題,首先是它具有不平衡的括號並忽略空格,但爲什麼不爲此目的使用'literal_eval'? – 2013-03-05 06:12:50

+0

對不起,錯過了字符串的引號..我很好奇,爲什麼正則表達式沒有工作..會嘗試與空間的地方。謝謝 – Ananth 2013-03-05 06:15:44

+2

另一個問題是,它有不平衡的括號 - 它有一個開放,但兩個關閉。 (當你說某件事不起作用時,你應該總是顯示回溯,最好有一個可重現的例子) – 2013-03-05 06:16:25

回答

2

您的一些問題與評論中提到的一樣,包括不平衡的括號和不考慮空白。這是一個正則表達式,將提取您需要的東西:關於使用spliteval函數代替正則表達式

data = re.findall(r'\((\[(\d+,?\s?)+\]),\s*(\d+)\)', sample_string) 

# data: 
# [('[0, 22, 23, 24, 25, 47, 59]', '59', '36155'), 
# ('[0, 1, 22, 23, 24, 25, 47, 59, 7]', '7', '36154'), 
# ('[0, 1, 22, 23, 24, 25, 47, 50, 59, 7]', '7', '36153')] 

for d in data: 
    int_list_str = d[0] 
    trailing_int_str = d[2] 
5

我不會推薦你在這裏使用正則表達式,除非有一些令人信服的理由。

嘗試ast模塊

>>> import ast 
>>> sample_string = "([0, 22, 23, 24, 25, 47, 59],36155), ([0, 1, 22, 23, 24, 25, 47, 59, 7],36154), ([0, 1, 22, 23, 24, 25, 47, 50, 59, 7],36153)" 
>>> ast.literal_eval(sample_string) 
(([0, 22, 23, 24, 25, 47, 59], 36155), ([0, 1, 22, 23, 24, 25, 47, 59, 7], 36154), ([0, 1, 22, 23, 24, 25, 47, 50, 59, 7], 36153)) 
>>> 
+0

很高興知道這件事,謝謝。 – mVChr 2013-03-05 18:26:24

-1

Regex是你要解決的問題是一個壞主意。您將能夠使用您的比賽組捕獲最後一個項目。

例如:

>>> import re 
>>> 
>>> sample_string = r'([0, 22, 23, 24, 25, 47, 59],36155), ([0, 1, 22, 23, 24, 25, 47, 59, 7],36154), ([0, 1, 22, 23, 24, 25, 47, 50, 59, 7],36153)' 
>>> 
>>> regexStr = r'(\(\[((\d+,)*\d+)\],\d+\),)*\(\[(\d+,)*\d+\],\d+\)' 
>>> matchObj = re.match(regexStr, sample_string) 
>>> print matchObj.groups() 
('([0, 1, 22, 23, 24, 25, 47, 59, 7],36154), ', '0, 1, 22, 23, 24, 25, 47, 59, 7', '59, ', '59, ') 

使用eval而不是獲取列表出來的字符串。

+1

如果你不知道你在傳遞什麼,那麼'eval'更糟 – 2013-03-05 06:41:53

0

什麼?

list_of_lists = [] 
list_of_ints = [] 
tuple_list = sample_string.split(", ") 
for tup in tuple_list: 
    list_part,int_part = eval(tup) 
    list_of_lists.append(list_part) 
    list_of_ints.append(int_part) 

編輯:如果你一直有「」這隻會工作,每對元組和其他地方之間(即,您需要在列表中的逗號後的元組內把空格去掉)。由於您的數據沒有以此格式進行格式化,因此此方法將失敗。

+1

直接使用'split'會把這個'[''''''[[''''''''''''''''''' 25','47','59],36155)','('0','1','22','23','24','25','47','59',' 7],36154)','([0','1','22','23','24','25','47','50','59','7],36153 )']'這不是你想要的 – Tuxdude 2013-03-05 06:44:03

+0

哎呀,是的,沒有注意到列表中的逗號後面也有空格。 – 2013-03-05 07:53:10