代码之家  ›  专栏  ›  技术社区  ›  Humphrey Bogart

返回带有regexp的行列表中的单词列表

  •  0
  • Humphrey Bogart  · 技术社区  · 15 年前

    我正在字符串列表上运行以下代码以返回其单词列表:

    words = [re.split('\\s+', line) for line in lines]
    

    然而,我最终得到的结果是:

    [['import', 're', ''], ['', ''], ['def', 'word_count(filename):', ''], ...]
    

    与预期相反:

    ['import', 're', '', '', '', 'def', 'word_count(filename):', '', ...]
    

    我怎样才能把清单拆开 re.split('\\s+', line) 在上面的列表中产生理解?不,我试过用 * 但那不管用。

    (我在寻找一种简单的、蟒蛇式的方法;我很想写一个函数,但我确信语言可以解决这个问题。)

    4 回复  |  直到 13 年前
        1
  •  4
  •   Pär Wieslander    15 年前
    >>> import re
    >>> from itertools import chain
    >>> lines = ["hello world", "second line", "third line"]
    >>> words = chain(*[re.split(r'\s+', line) for line in lines])
    

    这将为您提供一个迭代器,可用于遍历所有单词:

    >>> for word in words:
    ...    print(word)
    ... 
    hello
    world
    second
    line
    third
    line
    

    创建列表而不是迭代器只是将迭代器包装在 list 呼叫:

    >>> words = list(chain(*[re.split(r'\s+', line) for line in lines]))
    
        2
  •  1
  •   unode    15 年前

    之所以得到一个列表,是因为re.split()返回一个列表,然后该列表将被“附加”到列表理解输出中。

    不清楚你为什么要用它(或者可能只是一个坏例子),但是如果你能得到完整的内容(所有行)作为一个字符串,你就可以这样做。

    words = re.split(r'\s+', lines)
    

    如果行是以下项的产物:

    open('filename').readlines()
    

    使用

    open('filename').read()
    

    相反。

        3
  •  0
  •   perimosocordiae    15 年前

    你可以一直这样做:

    words = []
    for line in lines:
      words.extend(re.split('\\s+',line))
    

    它几乎没有一行列表理解那么优雅,但它能完成任务。

        4
  •  0
  •   machine yearning    13 年前

    只是偶然发现了这个老问题,我想我有更好的解决办法。通常,如果您想嵌套一个列表理解(“附加”每个列表),您需要向后思考(不支持循环)。这不是你想要的:

    >>> import re
    >>> lines = ["hello world", "second line", "third line"]
    >>> [[word for word in re.split(r'\s+', line)] for line in lines]
    [['hello', 'world'], ['second', 'line'], ['third', 'line']]
    

    但是,如果要“扩展”而不是“附加”正在生成的列表,只需去掉多余的方括号集,然后反转for循环(将它们恢复为“正确”的顺序)。

    >>> [word for line in lines for word in re.split(r'\s+', line)]
    ['hello', 'world', 'second', 'line', 'third', 'line']
    

    对我来说,这似乎更像是一个蟒蛇式的解决方案,因为它基于列表处理逻辑,而不是一些随机的ASS内置函数。每个程序员都应该知道如何做到这一点(尤其是那些试图学习Lisp的程序员!)