Странная замена обратной косой черты в Ruby

Вы можете создать привязку к событию :

    self.text_input.bind("",
                         lambda event: self.executecommand())

См. bind и keysyms . Обратите внимание, что в отличие от атрибута command, привязки вызываются с аргументом события, поэтому используется лямбда.

subprocess.call ожидает последовательность в качестве аргумента команды, поэтому вы, вероятно, используете что-то вроде этого:

    call([self.command], shell=True)

(В общем, shell=True небезопасно, но это в этом контексте, вероятно, все в порядке.)

26
задан Gilles 'SO- stop being evil' 16 June 2012 в 17:27
поделиться

4 ответа

Это проблема, потому что обратная косая черта (\) служит escape-символом для регулярных выражений и строк. Вы можете использовать специальную переменную \ & amp; уменьшить количество обратных косых черт в строке замены gsub.

foo.gsub(/\\/,'\&\&\&') #for some string foo replace each \ with \\\

РЕДАКТИРОВАТЬ: я должен упомянуть, что значение \ & amp; это от соответствия регулярному выражению, в данном случае один обратный слеш.

Кроме того, я подумал, что существует особый способ создания строки, которая отключает escape-символ, но, очевидно, нет. Ни один из них не вызовет две косые черты:

puts "\\"
puts '\\'
puts %q{\\}
puts %Q{\\}
puts """\\"""
puts '''\\'''
puts <<EOF
\\
EOF  
18
ответ дан sanscore 28 November 2019 в 06:10
поделиться

Ага, сразу после того, как я все это напечатал, я понял, что \ используется для ссылки на группы в строке замены. Я предполагаю, что это означает, что вам нужен литерал \\ в строке замены, чтобы получить один замененный \. Чтобы получить литерал \\, вам нужно четыре \ с, поэтому для замены одного на два вам действительно нужно восемь (!).

# Double every occurrence of \. There's eight backslashes on the right there!
>> puts '\\'.sub(/\\/, '\\\\\\\\')

Что-то я пропустил? Есть ли более эффективные способы?

4
ответ дан Peter 28 November 2019 в 06:10
поделиться

книга кирки упоминает именно эту проблему, на самом деле. вот еще один вариант (со страницы 130 последнего издания)

str = 'a\b\c'               # => "a\b\c"
str.gsub(/\\/) { '\\\\' }   # => "a\\b\\c"
2
ответ дан Peter 28 November 2019 в 06:10
поделиться

Устранение небольшой путаницы во второй строке кода автора.

Вы сказали:

>> puts '\\ <- 2x a, because 2 backslashes get replaced'.sub(/\\/, 'aa')
# aa <- 2x a, because two backslashes get replaced

Две обратные косые черты здесь не заменяются. Вы заменяете 1 экранированную обратную косую черту двумя буквами a ('aa'). То есть, если вы использовали .sub (/ \\ /, 'a') , вы бы увидели только один 'a'

'\\'.sub(/\\/, 'anything') #=> anything
3
ответ дан 28 November 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: