如何检查字符串中是否只定义了符号?

问题描述:

我需要检查,如果字符串只包含预定义的符号列表,做这样的事情:如何检查字符串中是否只定义了符号?

my_string = '[email protected]#$%^' 
tmp = str.maketrans({'0': None, 'x': None, '#': None, '$': None, 'q': None, 'i': None}) 
if my_string.translate(tmp) == '': 
    print("Only predefined symbols!") 

有没有更好的方式来实现这一目标?

my_string = '[email protected]#$%^' 
predef = set('0x#$qi') 

if set(my_string).issubset(predef): 
    print "only predefined symbols" 
+1

这是整洁。您也可以使用'set(my_string) - predef'来获取不在预定义集合中的字符,这可能会使错误处理更容易。 – Johnsyweb 2012-04-25 08:27:08

+0

真棒,谢谢 – user1355585 2012-04-25 08:35:06

我经常提倡替代正则表达式,因为我认为它经常被用作寻找问题的解决方案,但在这种情况下,我认为它可能是适当的。

import re 
pat = re.compile("^[0x#$qi]*$") 
my_string = '[email protected]#$%^' 
if pat.match(my_string): 
    print("Only predefined symbols!") 

只要确保如果"]"是预定义的标志之一是方括号中的第一个符号。

与euromino设置方法的快速比较表明,使用您在问题中使用的字符串,速度提高了3倍。从时间上排除了patpredef的创建,所以这是“重复使用”的情况。如果包含它们,差异会减小,但正则表达式仍然更快。

+0

这可能会更快,但我在'pat'的创建中看到了一个可能的错误源,您必须在其中实现']'的可能外观的正确定位。另外如果包含'^',它不能在第一个位置,'''必须被转义,也许还有一些我们忘记了。如果预定义符号列表在执行过程中发生了变化,那么过于复杂。 – eumiro 2012-04-25 08:29:47

+0

Timeit显示[@ eumiro's解决方案](http://*.com/a/10311693/78845)以80%的时间在我的笔记本电脑上运行。 – Johnsyweb 2012-04-25 08:31:15

+0

@eumiro你说得对,这些都是有效和重要的问题,还有一个原因我怀疑使用正则表达式,如果我可以避免它。 – 2012-04-25 08:33:11