过滤列表的一部分?

时间:2013-09-07 04:27:00

标签: python string list filtering

假设我要求输入,用户输入:

"RED REDD REDDD REDDDDD"

我将字符串转换为名为red的列表。 red[0] = 'RED', red[1] = 'REDD'等等。

如何获取它以便仅显示字母D,并删除其他所有内容?那么red[0]将是Dred[1]将是DD,依此类推。有这个方法吗? THX

3 个答案:

答案 0 :(得分:3)

您可以使用re.sub;使用'D'替换''以外的所有内容。

>>> import re
>>> strs = "RED REDD REDDD REDDDDD ABCDeeeeDDDDDDDD ABCD"
>>> [re.sub(r'[^D]+', r'', item) for item in strs.split()]
['D', 'DD', 'DDD', 'DDDDD', 'DDDDDDDDD', 'D']

或:

>>> re.sub(r'[^D\s]+', r'', strs).split()
['D', 'DD', 'DDD', 'DDDDD', 'DDDDDDDDD', 'D']

答案 1 :(得分:3)

您有很多选择,其中一些已在其他答案中注明,以及:

模式匹配的正则表达式

import re
s = "RED REDD REDDD REDDDDD"
pattern = r'D+' 
re.findall(pattern, s)

字符串操作

[''.join([c for c in x if c=='D']) for x in s.split()]

答案 2 :(得分:1)

我的解决方案可能看起来不如上述那么简单易懂,但它们显示了一些替代方法,这些方法可能会让您对首先尝试做的事情有不同的看法。至少,这些不同于使用正则表达式或列表理解,因为它们应该适用于大输入,只有在您需要时才能生成所需的组。

itertools.groupby

from itertools import groupby
# Groups of adjacent letters 'D' and not 'D'
g = groupby("RED REDD REDDD REDDDD", lambda c:c=='D')
# Literally what you asked for:
[''.join(i[1]) for i in g if i[0]]

collections.Counter

from collections import Counter
words = "RED REDD REDDD REDDDD".split()
# for large input: (i[itertools.groupby("RED REDD REDDD REDDDD", lambda c:c!=' '))
counters = (Counter(w) for w in words)
# Literally what you asked for:
[c['D']*'D' for c in counters]