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

Python 测试字符串是否仅包含给定字符,python,string,Python,String,在Python中,检查字符串是否只包含某些指定字符的最简单方法是什么?(当然,不使用正则表达式或任何东西) 具体来说,我有一个stings列表,我想过滤掉所有stings,除了那些只由另一个字符串中的任何字母组成的单词。例如,过滤['aba',acba',caz']虽然'abc'应该给出['aba',acba']。(z不在abc中) 就像只保留可以使用给定字母制作的项目一样。您可以使用: 假设您只希望列表中的字符串只包含搜索字符串中的字符,则可以轻松执行 >>> hay = [

在Python中,检查字符串是否只包含某些指定字符的最简单方法是什么?(当然,不使用正则表达式或任何东西)

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

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

您可以使用:


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

>>> hay = ['aba', 'acba', 'caz']
>>> needle = set('abc')
>>> [h for h in hay if not set(h) - needle]
['aba', 'acba']
如果不想避免集合,也可以使用。在这种情况下,您将删除搜索字符串中的所有字符

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

假设您的示例中的差异是打字错误,那么这应该可以:

my_list = ['aba', 'acba', 'caz']
result = [s for s in my_list if not s.strip('abc')]
结果是
['aba','acba']
。如果要剥离的字符串在输入中只包含字符,则将返回空字符串。字符的顺序应该无关紧要。

下面是代码:

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

我认为您不愿意使用regexp并不是一个真正的问题:

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

关于重复使用基字符串中的字母,这个问题有些含糊不清。或者如果应该或不应该重复,或者允许丢失字母。此解决方案通过包含
重用
参数的函数解决以下问题:

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

您想要返回“acb”或“acba”?您试图实现什么?在没有正则表达式的情况下,它看起来很像家庭作业。正则表达式怎么了?那将是一句非常琐碎的话…@Joseph你是什么意思?列表中的第二项是
'acba'
,在预期输出中,它被减少为仅
'acb'
?是的,我希望它返回
acd
acba
。不,这不是真正的家庭作业,我正在写一个程序,计算有多少英语单词可以由受限字符组成。但是是的,我是一个noob。
re.escape(给定)
会更安全。@Paco:
当然
部分可能表明对固有复杂性的偏见。我认为这种偏见应该得到纠正。这就是我的假设。当然,我可能是错的,但我试图证明
RegEx或任何
都是简单友好的。@Bakuriu+1是的-如果您已经有了一个集合,请使用适当的方法,而不是将另一个项目转换为集合并提供现有的集合:)嗯。我突然想到,对称的差别是行不通的。因为它匹配的当且仅当
包含与
s
完全相同的元素(
set('abc')。symmetric_difference('aba')->{c'}
)。虽然我们希望
item
成为元素的
子集,但是
s.issuperte(item)
应该这样做:s@Bakuriu您对
frozenset
的评论是正确的,经过测试,您发现
frozenset
在这里速度较慢。谢谢。@alecxe我相信CPython对
set
frozenset
s的实现基本相同(例如,有一些常用函数可以创建新的
set
,更新它等等,请参阅源代码中的
对象/setobject.c
文件)
frozenset
s根本不提供有副作用的方法。我删除了那个评论,因为其余的都是错的。
>>> anagram_filter(['aba', 'acba', 'caz'], 'abc')
['aba', 'acba']
>>> anagram_filter(['aba', 'acba', 'caz'], 'abc', False)
[]
>>> anagram_filter(['aba', 'cba', 'caz'], 'abc', False)
['cba']