Подтвердить что ты не робот

Python: как преобразовать строковый литерал в строковый литерал?

Я читаю в строке из текстового поля 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
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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']

В вашем графическом интерфейсе есть что-то интересное. Вот простой пример захвата некоторого пользовательского ввода через 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']

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

Ответ 3

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

<я > s1 = "welcome\tto\tPython"

raw_s1 = "%r"%s1

print(raw_s1)

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

welcome\tto\tPython

Ответ 4

Когда вы читаете строку из элемента управления графическим интерфейсом, она уже является "сырой" строкой. Если вы распечатываете строку, вы можете увидеть обратную косую черту вдвое, но это артефакт о том, как 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

Ответ 5

import re

matches = []
var = 'Hello, how are you?'

search_term = 'how are'


if re.search('\\b'+search_term+'\\b', var):
    matches.append(search_term)
    print matches

else:
    print 'false'