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) 但想知道为什么上面的正则表达式无法正确解析它?

4

4 回答 4

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))
>>> 
于 2013-03-05T06:30:51.403 回答
2

评论中提到了您的一些问题,包括不平衡的括号和不考虑空格。这是一个将提取您需要的内容的正则表达式:

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]
于 2013-03-05T06:31:51.990 回答
0

使用splitandeval函数代替正则表达式怎么样?

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)

编辑:这只有在每对元组之间始终有“,”且其他任何地方都没有(即,您需要删除列表中和元组中的逗号之后的空格)时才有效。由于您的数据不是以这种方式格式化的,因此这种方法将失败。

于 2013-03-05T06:38:59.743 回答
-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改为使用从字符串中获取列表。

于 2013-03-05T06:31:48.043 回答