Python:编译正则表达式问题

时间:2010-09-16 02:13:17

标签: python regex list

我有一个有趣的问题。我有一个列表列表,我希望除了每个列表的第一个元素编译成正则表达式。然后回到列表中。列表以字符串开头。

以下代码不起作用。它不会引发错误,它似乎什么也没做。我想我已经确定了这个问题。 (见下文)

代码:

for i in range(len(groups)):
    for j in range(len(groups[i][1:])):
        groups[i][1:][j] = re.compile(groups[i][1:][j])

我认为问题在于,list[1:] = [1,2,3]有效,list[1:][1] = 2不起作用。 适当的解决办法是什么?

3 个答案:

答案 0 :(得分:2)

#!/usr/bin/env python

import re

lol = [
    ["unix", ".*", "cool(, eh)?"],
    ["windows", "_*.*", "[wft]*"],
]

# think of `il` as inner list and `ii` as inner item (if you need) ...
print [ ii[:1] + map(re.compile, ii[1:]) for ii in [ il for il in lol ]]

# ... or, since list comprehensions are preferred over `map`
print [ ii[:1] + [re.compile(x) for x in ii[1:]] for ii in [ il for il in lol ]]

将屈服:

[['unix', <_sre.SRE_Pattern object at 0x100559b90>, <_sre.SRE_Pattern object
at 0x10052b870>], ['windows', <_sre.SRE_Pattern object at 0x100590828>,
<_sre.SRE_Pattern object at 0x10049b780>]]

答案 1 :(得分:1)

为什么要用切片来打扰?为什么不做......

for i in range(len(groups)):
    for j in range(1, len(groups[i])):
        groups[i][j] = re.compile(groups[i][j])

您问题的更详细说明:

在Python中“分配给切片”实际上并不创建切片 - 它只是告诉原始对象替换某个范围的元素,因此实例a[:2] = [1,2,3]的原因是替换前3个元素一个清单。

如果您实际创建了一个切片,然后尝试索引它(la a[1:][0]),那么您实际上正在索引到切片对象(然后修改切片对象)而不是触摸原始对象。

答案 2 :(得分:0)

您应该提供更详细的工作示例以进一步调查。但是,你提到的问题似乎并不是一个问题。它确实有效。除非,我误解了一些事情。

>>> a=[1,2,3,4]
>>> a[1:]
[2, 3, 4]
>>> a[1:][0]
2
>>> a[1:][1]
3