web-dev-qa-db-ja.com

ユーザー入力を通じて受け取ったラテックスコードをエスケープするにはどうすればよいですか?

ユーザーが入力したGUIテキストボックスから文字列を読み取り、 pandoc で処理します。文字列には、バックスラッシュ文字を含む数学のラテックスディレクティブが含まれています。処理のために、文字列を生の文字列としてpandocに送信します。しかし、「\ theta」のようなものはタブになり、「heta」になります。

バックスラッシュ文字を含む文字列リテラルを生の文字列に変換するにはどうすればよいですか?

編集:

Develerx、空飛ぶ羊とunutbuに感謝します。しかし、どの解決策も私を助けてくれないようです。理由は、pythonには影響を与えないが、latexでは意味を持つバックスラッシュ文字が他にもあるためです。

たとえば、「\ lambda」。提案されたすべての方法が生成します

\\lambda

これは、ラテックス処理では処理されません。\ lambdaのままにしてください。

別の編集:

この仕事を手に入れることができれば、私はやり遂げるべきだと思います。 @マーク:3つの方法はすべて、私が望んではいけない答えを与えます。

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
39
Vijay Murthy

Pythonの生の文字列は、バックスラッシュをリテラルスラッシュとして解釈する必要があることをPythonインタープリターに伝える方法にすぎません。また、ユーザー入力は文字通り、つまり「生」で読み込まれる可能性が高いです。

これは、解釈が別の場所で発生することを意味します。しかし、あなたはそれが起こることを知っているなら、なぜそれを解釈しているもののためにバックスラッシュをエスケープしないのですか?

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

(できませんr"\" as 「生の文字列を単一のバックスラッシュで終わらせることはできません」 ですが、r"\\"同様に2番目の引数。

それがうまくいかない場合、ユーザー入力はバックスラッシュを解釈する何らかの不可解な理由のため、それを停止するように指示する方法が必要です。

41
flying sheep

既存の文字列を生の文字列に変換する場合は、以下のように再割り当てできます

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

印刷します

welcome\tto\tPython
15
prasad
a='\nu + \lambda + \theta'
d=a.encode('string_escape').replace('\\\\','\\')
print(d)
# \nu + \lambda + \theta

これは、nl、およびtの前に単一のバックスラッシュがあることを示しています。

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

GUIで何かファンキーなことが起こっています。 Tkinter.Entryを介して一部のユーザー入力を取得する簡単な例を次に示します。取得されたテキストには、nl、およびtの前にバックスラッシュが1つしかありません。したがって、追加の処理は必要ありません。

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をいじるのではなく、GUIの問題を修正することをお勧めします。

5
unutbu

GUIコントロールから文字列を読み取るとき、それは既に「生の」文字列です。文字列を印刷すると、バックスラッシュが2倍になることがありますが、これはPythonが文字列を表示する方法の結果です。内部にはまだ1つのバックスラッシュしかありません。

>>> 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
3
Mark Ransom

私はインターネット全体でさまざまな答えを試すことに多くの時間を費やしましたが、ある人にはうまくいくが他の人にはうまくいかない理由は、アプリケーションの非常に小さな奇妙な違いによるものだと思います。コンテキストについては、奇妙な、またはマップできないユニコード文字を含む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]
2
Katherine