Необработанные строки Python - это всего лишь способ сказать интерпретатору Python, что он должен интерпретировать обратную косую черту как буквальные косые черты. Если вы читаете строки, введенные пользователем, они уже прошли точку, где они могли быть сырыми. Кроме того, пользовательский ввод, скорее всего, читается буквально, то есть «raw».
Это означает, что интерпретация происходит где-то в другом месте. Но если вы знаете, что это происходит, почему бы не избежать обратных косых черт для того, что его интерпретирует?
s = s.replace("\\", "\\\\")
(Обратите внимание, что вы не можете делать r"\"
как "необработанная строка не может закончиться в одиночном обратном слэше ", но я мог бы использовать r"\\"
также для второго аргумента.)
Если это не сработает, ваш пользовательский ввод используется по какой-то тайной причине, интерпретирующей обратную косую черту, так что вам нужно будет сказать, чтобы остановить это.
Если вы хотите преобразовать существующую строку в необработанную строку, мы можем переназначить это, как показано ниже
s1 = "welcome\tto\tPython"
raw_s1 = "%r"%s1
print(raw_s1)
Будет напечатан
welcome\tto\tPython
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'
Я потратил много времени на различные ответы по всему Интернету, и я подозреваю, почему одни вещи работают для некоторых людей, а не для других, из-за очень небольших странных различий в приложении. Для контекста мне нужно было прочитать имена файлов из файла csv, в котором были странные и / или unmappable символы Unicode и записать их в новый файл 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]
Для python 3:
a = "hello there!"
a_raw = r'%s'%a
print(a_raw)
hello_there!
См. также:
Когда вы читаете строку из элемента управления 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
Другой способ преобразования «string» в «raw string»
def string2RawString(string):
rawString = ''
for i in string.split('\\'):
rawString = rawString+("%r"%i).strip("'")+"\\"
return rawString
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
.