1

我在 python 中有一个巨大的列表,看起来像这样:

('foo','bar','foo/bar','foo1','bar/1')

上面的每个值都说明了列表包含的字符种类 - aplhanumeric 加斜线。我需要一种方法将该列表转换为元组列表,如下所示:

(('foo','foo'),('bar','bar'),('foo/bar','foo/bar'),('foo1','foo1'),('bar/1','bar/1'))

那么有什么比正则表达式搜索和替换更好的方法来做到这一点,对吧?(如我错了请纠正我)。

因此,我试图匹配引号之间的任何内容,但逗号除外,因为从技术上讲,它们也在引号之间。我使用lookahead 和lookbehind 来匹配任何东西:

(?<=')(.*?)(?=')

但这仅匹配引号和逗号中的值。我需要的是匹配值加上除逗号之外的引号,并使用替换正则表达式使列表看起来像上面的元组。

我不能手动执行此操作,因为列表很大。

有什么想法吗?

4

1 回答 1

2

好的,你有很多list字符串。你想要一个tuple,对于 的每个元素list,你都有一对(element, element)

这正是zip它所做的,除了它list在 2.x 中返回一个这样的对,或者在 3.x 中返回一个迭代器。无论哪种方式,您都可以tuple通过调用将其转换为tuple. 所以:

tuple(zip(huge_list, huge_list))

更一般地,如果您想逐个元素地转换序列,您可以使用推导式或生成器表达式。没有“元组推导”,但只需将生成器表达式传递给tuple函数即可。所以:

tuple((element, element) for element in huge_list)

或者,如果您想要一tuple(s[0], s[1:])而不是(s, s)对:

tuple((element[0], element[1:]) for element in huge_list)

等等。

同时,我想不出任何将对象转换为对象以在其repr上运行正则表达式转换并重新解析它的任何情况在 Python 中都是一个好主意。这不仅仅是“现在他们有两个问题”的问题;解析生成的字符串(并且,即使您不关心安全性,弄清楚如何处理 where 的事情eval(repr(x)) != x)将比您开始的任何事情都更难。所以,如果你发现自己试图完成这项工作,请退后一步。

于 2013-02-21T20:10:41.463 回答