使用正则表达式从行列表中返回单词列表

0 投票
4 回答
524 浏览
提问于 2025-04-15 21:17

我在处理一个字符串列表,想要得到一个单词的列表:

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风格的方法;我本来想写个函数,但我相信Python应该有更好的解决办法。)

4 个回答

0

你可以这样做:

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

虽然这个方法没有一行代码的列表推导那么优雅,但它能完成任务。

1

你得到一个列表里面还有列表的原因是因为 re.split() 这个函数返回的是一个列表,然后这个列表又被“添加”到列表推导式的输出中。

不太清楚你为什么要这样做(可能只是个不太好的例子),但是如果你能把所有内容(所有行)作为一个字符串获取到,你可以直接这样做:

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

如果 lines 是:

open('filename').readlines()

那么就用:

open('filename').read()

来替代。

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

撰写回答