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

было бы лучше, чтобы проверить, если строка имеет ASCII-только символы (между 32 и 127) –

+0

что вы на самом деле пытаетесь проверить? Коду не существует способа определить, есть ли специальный персонаж случайно или специально. Если вы хотите проверить наличие специальных символов (для любого определения «special»), просто сделайте это. – 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

да, но вы можете справиться с большинством случаев, поэтому это может стоить того. Спасибо за редактирование. –

Смежные вопросы