6

ファイルに次のような行が含まれているとします。

(?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)')

私はしません。

したがって、質問は基本的に、宣言/代入モード (例: ) でないときに生の文字列を渡すことができa = r'string'ます。文字列は既にメモリ内にあります。

4

3 に答える 3

8

生の文字列表記は、Pythonソースコードでのみ使用されます。生の文字列として宣言されたすべての文字列は、「コンパイル時」に必要なエスケープシーケンスが追加された通常の文字列に「変換」されます((Python 2では)2つの異なる文字列タイプの文字列/ユニコード文字列とは異なります)。

>>> 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)'
于 2011-11-24T08:52:25.397 に答える
2

文字列を使用している場所ならどこでも生の文字列を使用できます。生の文字列は、エスケープ文字がたくさんある場合に文字列を表すユーザーフレンドリーな方法です。

2 番目のケースは、'\'. したがって、別の を使用してエスケープする必要があります'\'。を与えると、2番目のケースが機能するはずです'(?i:\\bsys\\.user_catalog\\b)'。メモリには ASCII や Unicode が格納されるため、生の文字列かどうかは関係ありません。

于 2011-11-24T08:48:21.953 に答える
1

あなたはこれについて間違った方法で考えています。「生の文字列」タイプはなく、「文字列」のみです。引用符の前に書くrと、次の文字列をどのように解釈するかを python に伝えるだけです。

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

于 2011-11-24T08:59:29.680 に答える