Python 使用regexp返回行列表中的单词列表

Python 使用regexp返回行列表中的单词列表,python,regex,python-3.x,list-comprehension,Python,Regex,Python 3.x,List Comprehension,我正在字符串列表上运行以下代码,以返回其单词列表: words = [re.split('\\s+', line) for line in lines] 然而,我最终得到的结果是: [['import', 're', ''], ['', ''], ['def', 'word_count(filename):', ''], ...] 与预期相反: ['import', 're', '', '', '', 'def', 'word_count(filename):', '', ...] 如何解

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

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)
?我天真地尝试使用
*
,但那不起作用


(我正在寻找一种简单的python方法;我曾试图编写一个函数,但我确信该语言能够适应此问题。)

您可以始终这样做:

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

它远不如一行列表理解那么优雅,但它完成了任务。

您始终可以这样做:

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

它远不如一行列表理解那么优雅,但它完成了任务。

获得列表列表的原因是re.split()返回一个列表,然后以“附加”的形式添加到列表理解输出中

不清楚为什么要使用它(或者可能只是一个糟糕的例子),但是如果你能以字符串的形式获取全部内容(所有行),你就可以这样做

words = re.split(r'\s+', lines)
如果线是以下各项的乘积:

open('filename').readlines()
使用


相反。

获取列表的原因是,re.split()返回一个列表,然后将其“附加”到列表理解输出中

>>> import re
>>> from itertools import chain
>>> lines = ["hello world", "second line", "third line"]
>>> words = chain(*[re.split(r'\s+', line) for line in lines])
不清楚为什么要使用它(或者可能只是一个糟糕的例子),但是如果你能以字符串的形式获取全部内容(所有行),你就可以这样做

words = re.split(r'\s+', lines)
如果线是以下各项的乘积:

open('filename').readlines()
使用

相反

>>> 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]))
这将为您提供一个迭代器,可用于循环遍历所有单词:

>>> 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]))

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

>>> 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循环(将它们放回“正确”的顺序)


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

刚刚偶然发现了这个老问题,我想我有一个更好的解决方案。通常,如果您想要嵌套一个列表理解(“附加”每个列表),您会向后思考(类似循环的un)。这不是你想要的:

>>> 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循环(将它们放回“正确”的顺序)


对我来说,这似乎是一个更具python风格的解决方案,因为它基于列表处理逻辑,而不是一些随机的内置函数。每个程序员都应该知道如何使用Python3实现这一点(尤其是那些试图学习Lisp的程序员)

!不再使用readlines(),所有内容都是Unicode。而且,
re.split
不接受列表参数(我已经尝试过了)。@Kevin True;然而,我使用的是
list(file)
@beu,看看你的例子,除了来自文件或类似文件的类型之外,我想不出其他任何东西。因此,将其作为字符串读取(如上所述)是可行的!不再使用readlines(),所有内容都是Unicode。而且,
re.split
不接受列表参数(我已经尝试过了)。@Kevin True;然而,我使用的是
list(file)
@beu,看看你的例子,除了来自文件或类似文件的类型之外,我想不出其他任何东西。因此,将其作为字符串读取(如上所述)是可行的。有时我会想念Haskell的concatMap…有时我会想念Haskell的concatMap…这是一种非常棒的方法,尽管我很失望Python不允许使用不那么“杂乱”的方法。干杯。或者,您可以使用
chain.from_iterable
,而无需解包列表。更容易逆转denest的理解,这是一种非常棒的方法,尽管我很失望Python不允许使用更“杂乱”的方法。干杯。或者,您可以使用
chain.from\u iterable
,而无需打开列表。更容易颠倒最密集的理解