使用正则表达式从字符串中获取子字符串

时间:2014-11-24 22:32:06

标签: python regex

我有一个字符串形式:

integerinteger,以逗号分隔的字符串列表,整数

例如:

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

我想返回此子串['REFERENCED', 'UPTODATE', 'LRU']

我想过使用split(", ")然后将事情连在一起,但它会变得如此复杂。如何用正则表达式做到这一点?

4 个答案:

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

安全地评估包含python文字的字符串,并将第三个元素从tuple中拉出来。

答案 1 :(得分: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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果您只是在寻找表达方式,请尝试以下方法:

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