检查字符串是否仅包含 Python 中某些指定字符的最简单方法是什么?(当然不使用 RegEx 或任何东西)
具体来说,我有一个字符串列表,我想过滤掉所有字符串,除了仅由另一个字符串中的任何字母组成的单词。例如,过滤['aba', 'acba', 'caz']
虽然'abc'
应该给出['aba', 'acba']
. (z
不在abc
)
就像只保留可以使用给定字母制作的物品一样。
假设您的示例中的差异是一个错字,那么这应该有效:
my_list = ['aba', 'acba', 'caz']
result = [s for s in my_list if not s.strip('abc')]
结果['aba', 'acba']
。 如果要剥离的字符串在输入中只包含字符,则string.strip(characters)将返回一个空字符串。字符的顺序应该无关紧要。
您可以使用集合:
>>> l = ['aba', 'acba', 'caz']
>>> s = set('abc')
>>> [item for item in l if not set(item).difference(s)]
['aba', 'acba']
假设您只想要列表中只有搜索字符串中的字符的字符串,您可以轻松地执行
>>> hay = ['aba', 'acba', 'caz']
>>> needle = set('abc')
>>> [h for h in hay if not set(h) - needle]
['aba', 'acba']
如果你不想避免集合,你也可以使用str.translate
. 在这种情况下,您将删除搜索字符串中的所有字符。
>>> needle = 'abc'
>>> [h for h in hay if not h.translate(None,needle)]
['aba', 'acba']
像这样的东西:
strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda string: all(char in given for char in string), strings)
关于重新使用基本字符串中的字母,这个问题有些模棱两可。或者是否应该或不应该重复,或者允许缺少字母。该解决方案使用包含reuse
参数的函数解决了该问题:
from collections import Counter
def anagram_filter(data, base, reuse=True):
if reuse: # all characters in objects in data are in base, count ignored
base = set(base)
return [d for d in data if not set(d).difference(base)]
r = []
cb = Counter(base)
for d in data:
for k, v in Counter(d).iteritems():
if (k not in cb.keys()) or (v > cb[k]):
break
else:
r.append(d)
return r
用法:
>>> anagram_filter(['aba', 'acba', 'caz'], 'abc')
['aba', 'acba']
>>> anagram_filter(['aba', 'acba', 'caz'], 'abc', False)
[]
>>> anagram_filter(['aba', 'cba', 'caz'], 'abc', False)
['cba']
我会假设您不愿意使用正则表达式并不是真正的问题:
strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda value: re.match("^[" + given + "]$", value), strings)
下面是代码:
a = ['aba', 'acba', 'caz']
needle = 'abc'
def onlyNeedle(word):
for letter in word:
if letter not in needle:
return False
return True
a = filter(onlyNeedle, a)
print a