如何在python中检查字符串是否只包含给定集合中的字符
我有一个用户输入的多项式,我只想在字符串如何在python中检查字符串是否只包含给定集合中的字符,python,string,python-2.5,Python,String,Python 2.5,我有一个用户输入的多项式,我只想在字符串1234567890^-+x中只有字符时使用它 在不使用外部软件包的情况下,我如何检查它是否正确?我只想使用内置的Python 2.5函数 我正在编写一个在任何Mac电脑上运行的程序,不需要外部软件包 您可以将有效字符转换为集合,因为集合提供了更快的查找 然后你可以使用这样的函数 valid_chars = set("1234567890^-+x") # Converting to a set if all(char in valid_chars for
1234567890^-+x
中只有字符时使用它
在不使用外部软件包的情况下,我如何检查它是否正确?我只想使用内置的Python 2.5函数
我正在编写一个在任何Mac电脑上运行的程序,不需要外部软件包
集合
,因为集合提供了更快的查找valid_chars = set("1234567890^-+x") # Converting to a set
if all(char in valid_chars for char in input_string):
# Do stuff if input is valid
valid_chars = set("1234567890^-+x") # Converting to a set
if set(input_string).issubset(valid_chars):
# Do stuff if input is valid
使用正则表达式:
import re
if re.match('^[-0-9^+x]*$', text):
# Valid input
re
模块随Python 2.5提供,是您最快的选择
演示:
重新匹配(“^[-0-9^+x]*$”,“1x2^4-2”)
这里有一些奇怪的;-)方法:
good = set('1234567890^-+x')
if set(input_string) <= good:
# it's good
else:
# it's bad
将字符串转换为集合,并检查输入集合是否为良好集合的子集,如下所示:
>>> good_set = set('1234567890^-+x')
>>> input_set1 = set('xajfb123')
>>> input_set2 = set('122-32+x')
>>> input_set1.issubset(good_set)
False
>>> input_set2.issubset(good_set)
True
>>>
还有另一种方法,现在使用:
这不是最可读的方式。如果您需要,它应该是最快的功能之一。
min()
并不是完成此任务的最佳功能。同意所有功能都是最佳选择。来自其他语言的宿醉。我喜欢集合子集方法:-)想试试吗?@MartijnPieters,一点机会也没有-有很多方法可以做到这一点,我不想花半个小时来组织它们;-)@user2357112,只是因为我永远记不起.issuperset()
到底做了什么,而不去查它:-(但我理解@MartijnPieters,当然,但使用方法拼写,我不查就记不清哪个是=
。所以我避开了它们。=
对我来说是显而易见的。@MartijnPieters:issuperset
会……等等,显然它不会短路。我以为它会在不构建集合的情况下进行测试从输入_字符串
,但当我尝试{0}.issuperset(xrange(100000000))
几秒钟前,它开始以某种方式消耗内存,似乎表明它将输入转换为一个集合。我想这没有性能优势。集合有一个issuperset
方法来实现这一点。@user2357112现在请检查我的答案,我使用的issubset
不是将字符串转换为集合的语法;您想要set(“1234567890^-+x”)
(为什么我先看到另一个东西?@user2357112,这叫做集合理解。不,不是。它是一个集合文本,有1个元素。你可以将None
作为第一个参数传递给translate()
。还有人还要检查Python 2.5吗?哈哈;-)它适用于所有当前的蟒蛇:-)
good = set('1234567890^-+x')
if set(input_string) <= good:
# it's good
else:
# it's bad
if input_string.strip('1234567890^-+x'):
# it's bad!
else:
# it's good
>>> good_set = set('1234567890^-+x')
>>> input_set1 = set('xajfb123')
>>> input_set2 = set('122-32+x')
>>> input_set1.issubset(good_set)
False
>>> input_set2.issubset(good_set)
True
>>>
>>> import string
>>> all_chars = string.maketrans('', '')
>>> has_only = lambda s, valid_chars: not s.translate(all_chars, valid_chars)
>>> has_only("abc", "1234567890^-+x.")
False
>>> has_only("x^2", "1234567890^-+x.")
True