用于复杂列表和整数组合的python正则表达式

用于复杂列表和整数组合的python正则表达式,python,regex,Python,Regex,我需要解析一个字符串:以下是示例字符串: 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)+\) 正则表达式的目的是方便地访问元组的列表部分以及元组的整数部分。最简

我需要解析一个字符串:以下是示例字符串:

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

除非有令人信服的理由,否则我不建议您在这里使用正则表达式

尝试
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))
>>> 

我不建议您在这里使用正则表达式,除非有一些令人信服的理由

尝试
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))
>>> 

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
从字符串中取出列表。

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
将列表从字符串中删除。

您的一些问题如注释中所述,包括不平衡的括号和不考虑空格。下面是一个正则表达式,它将提取您需要的内容:

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]

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

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]

使用
split
eval
函数代替regex怎么样

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)

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

使用
split
eval
函数而不是regex如何

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)

编辑:只有在每对元组之间始终有“,”且无其他位置(即,需要删除列表中逗号后和元组内的空格)时,此选项才有效。因为您的数据不是以这种方式格式化的,所以这种方法将失败。

如果
sample\u string
是一个字符串,为什么它不在引号中?正则表达式存在多个问题,首先是它有不平衡的括号和忽略空格,但是为什么不为此使用
literal\u eval
?很抱歉错过了字符串的引号。。我很好奇为什么正则表达式不起作用。。将尝试将空间放置到位。另一个问题是,它有不平衡的括号-它有一个打开,但有两个关闭。(当你说有些东西不起作用时,你应该总是显示回溯,最好是用一个可复制的例子)如果
sample\u string
是一个字符串,为什么它不在引号中?正则表达式存在多个问题,首先是它有不平衡的括号和忽略空格,但是为什么不为此使用
literal\u eval
?很抱歉错过了字符串的引号。。我很好奇为什么正则表达式不起作用。。将尝试将空间放置到位。另一个问题是,它有不平衡的括号-它有一个打开,但有两个关闭。(当你说有些东西不起作用时,你应该总是显示回溯,最好是用一个可复制的例子)
eval
如果你不知道你在传递什么,情况会更糟
eval
如果你不知道你在传递什么,情况会更糟使用
split
直接获取这个
['([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',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)“
这不是您想要的,是的,没有注意到列表中逗号后面也有空格。