【问题标题】:Python: compiling regexp problemsPython:编译正则表达式问题
【发布时间】:2010-09-16 02:13:17
【问题描述】:

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

以下代码不起作用。它不会引发错误,它似乎没有做任何事情。我想我已经确定了问题所在。 (见下文)

代码:

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 无效。 什么是适当的修复?

【问题讨论】:

    标签: python regex list


    【解决方案1】:
    #!/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>]]
    

    【讨论】:

    • 有什么理由比下面的@Amber 更好吗?
    • @Skyler:如果您想要一个包含所做更改的新列表,那么这个解决方案可以做到这一点。如果您想就地修改列表,您需要坚持使用 for 循环。真正归结为使用您更容易阅读的那个
    【解决方案2】:

    为什么要切片呢?为什么不干...

    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 个元素.

    但是,如果您实际创建了一个切片,然后尝试对其进行索引(例如 a[1:][0]),那么您实际上是在为一个 切片对象 建立索引(然后修改切片对象) 而不是触摸原始对象。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-20
        • 2014-11-29
        • 1970-01-01
        相关资源
        最近更新 更多