2017-02-15 119 views
-1

跟着this question,我在想下面的函数是否足够检查没有意外的顺序反斜杠字符已经输入到一个路径中导致产生“特殊字符”。更清楚的是,\b是一个退格,而\后面跟着一个数字,起源于一些ascii字符代码。我想避免这种情况。还有像\d这样的序列没有特殊含义,显然在这种情况下,\会自动转义。我并不担心这一点。这里是我的功能:在路径字符串中正确转义检查反斜杠

def checkPathString(dir): 
    slash = False 
    for c in repr(dir): 
     if c == '\\': 
      slash = not slash 
     else: 
      if slash: 
       raise ValueError('Path contains unescaped \\ characters') 

它似乎正确地检测\b\后跟数字(如内部表示成为\x东西)。这也使我发现\f是一个特殊的序列,也被翻译成\x东西

检测为坏的字符串:

"C:\dummy\bar" #Because of "\b" 
"C:\dummy\2000" #Because of "\" followed by a number 

检测为好字符串:

"C:\dummy\\bar" #\d is escaped automatically because is not a special sequence 
"C:\dummy\\2000" 
+0

会更好,以检查是否有串(32与127) –

+0

仅ASCII字符什么是你真正想检查?代码无法确定是否有意或故意存在特殊字符。如果你想检查是否存在特殊字符(无论“特殊”的定义是什么),只需要这样做。 – Goyo

+0

@Goyo我编辑了这个问题,试图更好地指定我正在尝试解决的问题。 – Antonio

回答

1

有没有办法可以实现你的目标,因为,例如,你不能防止\x前缀,其定义ASCII字符,因为它们在输入时被解释。

>>> "\x61" 
'a' 
>>> repr("\x61") 
"'a'" 

因此,例如,任何检测方法将失败,给定的子文件夹名为x61abcde,如果输入字符串为“C:\虚设\ x61abcde”

此外,检测将失败的\几种组合然后是一个数字,例如你有这些直接的解释:\61 =>1\72 =>:

作为一个侧面说明,关于你提出的方法,我只想检查任何字符是在interval [32 ... 127](或[ 32 .. 255]如果你想支持重音)

def check_path_string(path): 
    if all(31<ord(c)<127 for c in path): 
     pass 
    else: 
     raise ValueError("path contains non-ascii characters") 
+0

谢谢你的回答,我现在明白的是,没有安全的方法来解决我的问题,因为没有办法检测用户是否输入序列“'\ x' * number *”(和你一样指出它会被立即解释),在不幸的情况下,一个子文件夹的名字开始,例如,用“x61”' – Antonio

+0

是的,但是你可以处理大多数情况,所以它可能是值得的。 –