如何确保包含引号的用户输入与in操作符一起正确地进行内容检查?



我目前正在用python (tkinter)编写一个应用程序,并遇到了用户输入字符串的问题。如果它们包含引号("'),我的代码就会崩溃。我的目标是检查字符串是否包含任何ASCII标点符号或数字(0123456789),当它包含时返回并引发和错误。

下面是一个简单的例子:

import string
a = '1"#' 
# A specific troubled string, but usually a tkinter.StringVar 
# using the .get() method that returns a str. The StringVar is part of a ttk.Entry field 
# which is essentially equivalent with built-in input() for this purpose
# ( " is intentionally not an
# escaped character since this is how both input() and tkinter return the string)
if a in string.digits.join(string.punctuation):
raise ValueError("incorrect")
else:
pass
# handle input

对于上述字符串a和任何其他包含字符"'的字符串,该表达式的计算结果为False,据我所知。如果我把它分离成(a in string.digits) or (a in string.punctuation),也会发生同样的事情。我尝试过的其他字符串都很好,只是不是这些。我还尝试过使用python中的str.replace()方法,它会给出这个例子:

import string
a = '1"#' 
if a.replace('"', "").replace("'", "") in string.digits.join(string.punctuation):
raise ValueError("incorrect")
else:
pass
# handle input

但这也有同样的问题。有办法解决这个问题吗?

注:下面是带有占位符字符串的实际StringVar的相同示例,如果有帮助的话,但这样做要简单得多:

import string
import tkinter as tk
_ = tk.Tk() # This is neccesary to appease tkinter but not used
a = tk.StringVar(value='1"#')
if a.get() in string.digits.join(string.punctuation):
raise ValueError("incorrect")
else:
pass
# handle input
import string
import tkinter as tk
_ = tk.Tk() # This is neccesary to appease tkinter but not used
a = tk.StringVar(value='1"#') 
if a.get().replace('"', "").replace("'", "") in string.digits.join(string.punctuation):
raise ValueError("incorrect")
else:
pass
# handle input

引号与此无关。这不是判断字符串是否包含标点符号或数字的方法。如果string1string2的子字符串,则string1 in string2为true。

我不知道你为什么使用.join()。这将创建一个字符串,其中每个标点字符由所有数字分隔:

'!0123456789"0123456789#0123456789$0123456789%0123456789&0123456789'0123456789(0123456789)0123456789*0123456789+0123456789,0123456789-0123456789.0123456789/0123456789:0123456789;0123456789<0123456789=0123456789>0123456789?0123456789@0123456789[0123456789\0123456789]0123456789^0123456789_0123456789`0123456789{0123456789|0123456789}0123456789~'

很少有只由数字和标点组成的字符串是它的子字符串。

你想要做的方法是使用every()函数循环遍历a中的所有字符,测试每个字符以确保它是数字或标点符号。

digits_and_punc = set(string.digits + string.punctuation)
if every(c in digits_and_punc for c in a):
pass
else:
raise ValueError("incorrect")

相关内容

  • 没有找到相关文章

最新更新