необработанная строка Python - PullRequest
4 голосов
/ 24 ноября 2011

Учитывая, что файл содержит строки, такие как:

(?i:\bsys\.user_catalog\b)

При чтении этой строки я хочу, чтобы значение было необработанной строкой (неэкранированной), то есть в памяти строка должна быть

r'(?i:\bsys\.user_catalog\b)'

вместо

(?i:\bsys\.user_catalog\b)

Который экранируется при передаче библиотекам, таким как sqlobject.

Например, с sqlobject, если я заявляю

Table(column=r'(?i:\bsys\.user_catalog\b)')

Я получаю желаемые результаты, в то время как, если я заявляю

Table(column='(?i:\bsys\.user_catalog\b)')

Я не знаю.

Так что вопрос в принципе, я могу передать необработанную строку, когда я не в декларативном / назначенииmode (например, a = r'string'), скорее строка уже находится в памяти.

Ответы [ 3 ]

6 голосов
/ 24 ноября 2011

Необработанная строковая нотация используется только в исходном коде Python;все строки, объявленные как необработанные строки, «преобразуются» в обычные строки с необходимыми escape-последовательностями, добавляемыми во время «времени компиляции» (в отличие от (в Python 2) двух различных типов строк string / Unicode string):

>>> r"\b"
'\\b'
>>> "Hello"
'Hello' 
>>> u"Hello"
u'Hello'

Если вы читаете строку из файла, она уже будет правильно экранирована.

(Предполагается, что test.txt содержит (?i:\bsys\.user_catalog\b)):

f = open("test.txt").read()
print f
print repr(f)

Вывод:

(?i:\bsys\.user_catalog\b)
'(?i:\\bsys\\.user_catalog\\b)'
2 голосов
/ 24 ноября 2011

Вы можете использовать необработанную строку везде, где вы используете строку. Необработанная строка - это просто удобный способ представления строки, когда у вас много escape-символов.

Второй случай не работает из-за '\'. Так что вам нужно избежать его, используя другой '\'. Второй случай должен сработать, если вы дадите '(?i:\\bsys\\.user_catalog\\b)'. В памяти, поскольку ASCII или Unicode хранятся, не имеет значения, является ли это необработанной строкой или нет.

1 голос
/ 24 ноября 2011

Вы думаете об этом неправильно. Нет типа «необработанная строка», только «строка». Запись r перед кавычками только говорит Python, как интерпретировать следующую строку.

http://docs.python.org/reference/lexical_analysis.html#string-literals

...