如何检查字符串中是否只定义了符号?
我需要检查,如果字符串只包含预定义的符号列表,做这样的事情:如何检查字符串中是否只定义了符号?
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"
我经常提倡替代正则表达式,因为我认为它经常被用作寻找问题的解决方案,但在这种情况下,我认为它可能是适当的。
import re
pat = re.compile("^[0x#$qi]*$")
my_string = '[email protected]#$%^'
if pat.match(my_string):
print("Only predefined symbols!")
只要确保如果"]"
是预定义的标志之一是方括号中的第一个符号。
与euromino设置方法的快速比较表明,使用您在问题中使用的字符串,速度提高了3倍。从时间上排除了pat
和predef
的创建,所以这是“重复使用”的情况。如果包含它们,差异会减小,但正则表达式仍然更快。
这可能会更快,但我在'pat'的创建中看到了一个可能的错误源,您必须在其中实现']'的可能外观的正确定位。另外如果包含'^',它不能在第一个位置,'''必须被转义,也许还有一些我们忘记了。如果预定义符号列表在执行过程中发生了变化,那么过于复杂。 – eumiro 2012-04-25 08:29:47
Timeit显示[@ eumiro's解决方案](http://stackoverflow.com/a/10311693/78845)以80%的时间在我的笔记本电脑上运行。 – Johnsyweb 2012-04-25 08:31:15
@eumiro你说得对,这些都是有效和重要的问题,还有一个原因我怀疑使用正则表达式,如果我可以避免它。 – 2012-04-25 08:33:11
这是整洁。您也可以使用'set(my_string) - predef'来获取不在预定义集合中的字符,这可能会使错误处理更容易。 – Johnsyweb 2012-04-25 08:27:08
真棒,谢谢 – user1355585 2012-04-25 08:35:06