ユーザーが入力した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
Pythonの生の文字列は、バックスラッシュをリテラルスラッシュとして解釈する必要があることをPythonインタープリターに伝える方法にすぎません。また、ユーザー入力は文字通り、つまり「生」で読み込まれる可能性が高いです。
これは、解釈が別の場所で発生することを意味します。しかし、あなたはそれが起こることを知っているなら、なぜそれを解釈しているもののためにバックスラッシュをエスケープしないのですか?
s = s.replace("\\", "\\\\")
(できませんr"\"
as 「生の文字列を単一のバックスラッシュで終わらせることはできません」 ですが、r"\\"
同様に2番目の引数。
それがうまくいかない場合、ユーザー入力はバックスラッシュを解釈する何らかの不可解な理由のため、それを停止するように指示する方法が必要です。
既存の文字列を生の文字列に変換する場合は、以下のように再割り当てできます
s1 = "welcome\tto\tPython"
raw_s1 = "%r"%s1
print(raw_s1)
印刷します
welcome\tto\tPython
a='\nu + \lambda + \theta'
d=a.encode('string_escape').replace('\\\\','\\')
print(d)
# \nu + \lambda + \theta
これは、n
、l
、およびt
の前に単一のバックスラッシュがあることを示しています。
print(list(d))
# ['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a']
GUIで何かファンキーなことが起こっています。 Tkinter.Entry
を介して一部のユーザー入力を取得する簡単な例を次に示します。取得されたテキストには、n
、l
、および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の問題を修正することをお勧めします。
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
私はインターネット全体でさまざまな答えを試すことに多くの時間を費やしましたが、ある人にはうまくいくが他の人にはうまくいかない理由は、アプリケーションの非常に小さな奇妙な違いによるものだと思います。コンテキストについては、奇妙な、またはマップできないユニコード文字を含む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]