Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查字符串中是否只有已定义的符号?_Python_Python 3.x - Fatal编程技术网

Python 如何检查字符串中是否只有已定义的符号?

Python 如何检查字符串中是否只有已定义的符号?,python,python-3.x,Python,Python 3.x,我需要检查字符串是否只包含预定义的符号列表,并执行以下操作: my_string = 'qwer123asd!@#$%^' tmp = str.maketrans({'0': None, 'x': None, '#': None, '$': None, 'q': None, 'i': None}) if my_string.translate(tmp) == '': print("Only predefined symbols!") 有更好的方法来实现这一点吗?我经常提倡使用regex

我需要检查字符串是否只包含预定义的符号列表,并执行以下操作:

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

有更好的方法来实现这一点吗?

我经常提倡使用regexp的替代方案,因为我认为它经常被用作查找问题的解决方案,但在这种情况下,我认为它可能是合适的

import re
pat = re.compile("^[0x#$qi]*$")
my_string = 'qwer123asd!@#$%^'
if pat.match(my_string):
    print("Only predefined symbols!")
只需确保如果
“]”
是预定义的符号之一,则它是方括号内的第一个符号


通过与euromino的set方法的快速比较,可以看出,使用您在问题中使用的字符串,该方法的速度要快3倍。
pat
predef
的创建被排除在计时之外,因此这是“重复使用”场景。如果包含它们,差异会更小,但regexp速度更快。

这很好。您还可以使用
set(my_string)-predef
获取不在预定义集合中的字符,这可能会使错误处理更容易。这可能会更快,但我在创建
pat
时发现了一个可能的错误源,您必须对
]
的可能外观进行正确定位。此外,如果包含
^
,则它不能位于第一个位置且
必须被转义,也许还有一些东西我们忘记了。如果预定义符号列表在执行过程中发生更改,则太复杂了。Timeit显示您在我的笔记本电脑上运行的时间占您的80%。@eumiro您是对的,这些都是值得关注的重要问题,也是我怀疑是否可以避免使用regexps的原因之一。@Johnsyweb奇怪。我使用的是Python2.7,这就是原因吗?示例测试:
python-m timeit-s'import-re;a=“qwer123asd!@$%^”;b=“0x#$qi”;p=re.compile(“^[{0}]*$”.format(b))”'p.match(a)
python-m timeit-s'a=“qwer123asd!@#$%^”;b=“0x#$qi”;p=set(b)'set(a).issubset(p)
@Johnsyweb您也在为导入语句计时,当然我的解决方案会很糟糕。时间点不是重复使用的部分吗?现在,我使用一些随机字符串、粘贴和相同结果对两个解决方案进行计时。
my_string = 'qwer123asd!@#$%^'
predef = set('0x#$qi')

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