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