2014-11-24 211 views
0

我對形式的字符串:使用正則表達式從字符串中獲取子

integerinteger,以逗號分隔的字符串列表,整數

例如:

"0, 0, ['REFERENCED', 'UPTODATE', 'LRU'], 1" 

我想返回這個子字符串['REFERENCED', 'UPTODATE', 'LRU']

我想用split(", "),然後加入到一起,但它會很複雜。如何用正則表達式來做到這一點?

+0

該輸入的語法是什麼?它可能與Python源代碼兼容?你可以使用['ast.literal_eval'](https://docs.python.org/2/library/ast.html#ast.literal_eval)嗎? – 2014-11-24 22:34:54

+1

'內部'字符串是否可以包含'['或']'字符? – 2014-11-24 22:36:30

+0

@TomDalton號這是一個很好的問題。我應該提到這一點 – Keeto 2014-11-24 22:39:26

回答

2

只寫一個正則表達式來捕獲由一個[的,任何字符,然後一個]一組。

>>> import re 
>>> s = "0, 0, ['REFERENCED', 'UPTODATE', 'LRU'], 1" 
>>> re.search(r'(\[.*\])', s).group(1) 
"['REFERENCED', 'UPTODATE', 'LRU']" 

如果輸入真的是這口井的結構,你可以使用ast.literal_eval

>>> import ast 
>>> ast.literal_eval(s)[2] 
['REFERENCED', 'UPTODATE', 'LRU'] 

要安全評估包含蟒蛇文字串並拉動第三元件從tuple的。

0

如果你只是在尋找一種表達,你可以試試:

"\[([\w\d,']+)\]" 
1

沒有必要使用正則表達式。將括號中的字符串包裝成一個列表的字符串表示,然後使用ast.literal_eval將其轉換爲實際列表。

import ast 
s = "0, 0, ['REFERENCED', 'UPTODATE', 'LRU'], 1" 
outer_list = ast.literal_eval('[' + s + ']') 
inner_list = outer_list[2] 
print(inner_list) 

你可能會被使用eval,而不是ast.literal_eval。抵制誘惑。使用eval是不安全的,因爲它會評估任何Python表達式,即使它包含討厭的東西,例如從硬盤中刪除文件的說明。您可以使用ast.literal_eval,因爲它only parses strings, numbers, tuples, lists, dicts, booleans, and None

1
s = "0, 0, ['REFERENCED', 'UPTODATE', 'LRU'], 1" 
start = s.find("[") 
end = s.rfind("]") 
print(s[start:end+1]) 
['REFERENCED', 'UPTODATE', 'LRU'] 
相關問題