Как я могу избежать латексного кода, полученного через пользовательский ввод? - PullRequest
39 голосов
/ 01 сентября 2011

Я читаю строку из текстового поля GUI, введенного пользователем, и обрабатываю его через pandoc . Строка содержит латексные директивы для математики, которые имеют символы обратной косой черты. Я хочу отправить строку как необработанную строку в pandoc для обработки. Но что-то вроде «\ theta» становится вкладкой, а «heta».

Как преобразовать строковый литерал, содержащий символы обратной косой черты, в необработанную строку ...?

Редактировать:

Спасибо develerx, летающим овцам и unutbu. Но ни одно из решений не помогает мне. Причина в том, что есть другие символы обратной косой черты, которые не имеют никакого эффекта в Python, но имеют значение в латексе.

Например, '\ lambda'. Все предложенные методы дают

\\lambda

, который не проходит при обработке латекса - он должен оставаться как \ lambda.

Другое редактирование:

Если я смогу получить эту работу, я думаю, что должен закончить. @Mark: Все три метода дают ответы, которые я не желаю.

a='\nu + \lambda + \theta'; 
b=a.replace(r"\\",r"\\\\"); 
c='%r' %a; 
d=a.encode('string_escape');
print a

u + \lambda +   heta
print b

u + \lambda +   heta
print c
'\nu + \\lambda + \theta'
print d
\nu + \\lambda + \theta

Ответы [ 5 ]

41 голосов
/ 01 сентября 2011

Необработанные строки Python - это просто способ сказать интерпретатору Python, что он должен интерпретировать обратную косую черту как буквальную косую черту. Если вы читаете строки, введенные пользователем, они уже прошли точку, в которой они могли быть необработанными. Кроме того, пользовательский ввод, скорее всего, читается буквально, то есть «сырой».

Это означает, что перевод происходит где-то еще. Но если вы знаете, что это происходит, почему бы не избежать обратной косой черты для того, что интерпретирует это?

s = s.replace("\\", "\\\\")

(Обратите внимание, что вы не можете сделать r"\" как «необработанная строка не может заканчиваться одной обратной косой чертой» , но я мог бы также использовать r"\\" для второго аргумента.)

Если это не сработает, ваш пользовательский ввод по какой-то непонятной причине интерпретирует обратную косую черту, поэтому вам понадобится способ заставить его остановить это.

15 голосов
/ 22 августа 2017

Если вы хотите преобразовать существующую строку в необработанную строку, то мы можем переназначить ее, как показано ниже

s1 = "welcome\tto\tPython"
raw_s1 = "%r"%s1
print(raw_s1)

Будет напечатано

welcome\tto\tPython
5 голосов
/ 01 сентября 2011
a='\nu + \lambda + \theta'
d=a.encode('string_escape').replace('\\\\','\\')
print(d)
# \nu + \lambda + \theta

Это показывает, что перед n, l и t и *1004*:

print(list(d))
# ['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a']

стоит один обратный слеш.Вот простой пример получения некоторого пользовательского ввода через Tkinter.Entry.Обратите внимание, что полученный текст имеет только одну обратную косую черту перед n, l и t.Таким образом, дополнительная обработка не требуется:

import Tkinter as tk

def callback():
    print(list(text.get()))

root = tk.Tk()
root.config()

b = tk.Button(root, text="get", width=10, command=callback)

text=tk.StringVar()

entry = tk.Entry(root,textvariable=text)
b.pack(padx=5, pady=5)
entry.pack(padx=5, pady=5)
root.mainloop()

Если вы введете \nu + \lambda + \theta в поле ввода, консоль (правильно) напечатает:

['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a']

Если ваш GUI невозвращая аналогичные результаты (как кажется из вашего поста), тогда я бы порекомендовал заняться исправлением проблемы с графическим интерфейсом, а не копаться с string_escape и строкой replace.

3 голосов
/ 01 сентября 2011

Когда вы читаете строку из элемента управления GUI, это уже «необработанная» строка. Если вы распечатаете строку, вы можете увидеть, что обратные слеши удвоились, но это артефакт того, как Python отображает строки; внутри все еще только один обратный слеш.

>>> a='\nu + \lambda + \theta'
>>> a
'\nu + \\lambda + \theta'
>>> len(a)
20
>>> b=r'\nu + \lambda + \theta'
>>> b
'\\nu + \\lambda + \\theta'
>>> len(b)
22
>>> b[0]
'\\'
>>> print b
\nu + \lambda + \theta
2 голосов
/ 21 августа 2018

Я потратил много времени, пытаясь найти разные ответы по всему Интернету, и я подозреваю, что причины того, почему одна вещь работает для некоторых людей, а не для других, связана с очень маленькими странными различиями в приложении.Для контекста мне нужно было прочитать имена файлов из файла CSV, в котором были странные и / или не отображаемые символы Юникода, и записать их в новый файл CSV.Для чего это стоит, вот что сработало для меня:

s = '\u00e7\u00a3\u0085\u00e5\u008d\u0095' # csv freaks if you try to write this
s = repr(s.encode('utf-8', 'ignore'))[2:-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...