测试字符串是否仅包含给定字符

时间:2013-09-09 09:12:27

标签: python string

检查字符串是否仅包含Python中的某些指定字符的最简单方法是什么? (当然,不使用RegEx或其他任何东西)

具体来说,我有一个stings列表,我想过滤掉所有这些,除了只由另一个字符串中的任何字母组成的单词。例如,通过['aba', 'acba', 'caz']过滤'abc'应该为['aba', 'acba']。 (z不在abc

就像只保留使用给定字母可以制作的物品一样。

7 个答案:

答案 0 :(得分:12)

假设您的示例中的差异是拼写错误,那么这应该有效:

my_list = ['aba', 'acba', 'caz']
result = [s for s in my_list if not s.strip('abc')]

结果为['aba', 'acba']。如果要删除的字符串只包含输入中的字符,string.strip(characters)将返回一个空字符串。角色的顺序无关紧要。

答案 1 :(得分:8)

您可以使用sets

>>> l = ['aba', 'acba', 'caz']
>>> s = set('abc')
>>> [item for item in l if not set(item).difference(s)]
['aba', 'acba']

答案 2 :(得分:6)

假设您只希望列表中的字符串只包含搜索字符串中的字符,则可以轻松执行

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

答案 3 :(得分:4)

这样的事情:

strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda string: all(char in given for char in string), strings)

答案 4 :(得分:1)

关于重复使用基本字符串中的字母,问题有些模棱两可。或者是否应该重复或不允许丢失字母。此解决方案使用包含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']

答案 5 :(得分:0)

以下是代码:

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

答案 6 :(得分:0)

我认为你对regexp的不情愿并不是一个问题:

strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda value: re.match("^[" + given + "]$", value), strings)