假设我要求输入,用户输入:
"RED REDD REDDD REDDDDD"
我将字符串转换为名为red
的列表。
red[0] = 'RED', red[1] = 'REDD'
等等。
如何获取它以便仅显示字母D
,并删除其他所有内容?那么red[0]
将是D
,red[1]
将是DD
,依此类推。有这个方法吗? THX
答案 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)
我的解决方案可能看起来不如上述那么简单易懂,但它们显示了一些替代方法,这些方法可能会让您对首先尝试做的事情有不同的看法。至少,这些不同于使用正则表达式或列表理解,因为它们应该适用于大输入,只有在您需要时才能生成所需的组。
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]]
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]