2017-02-15 99 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

是的,但是你可以處理大多數情況,所以它可能是值得的。 –