4

バックスラッシュを含む複数行の文字列を効果的に分割して、不要なエスケープ文字を別の行に分割するにはどうすればよいですか?

これが私が扱っている入力例です:

strInput = '''signalArr(0)="ASCB D\axx\bxx\fxx\nxx"
signalArr(1)="root\rxx\txx\vxx"'''

私はこれを試しました(単一のバックスラッシュを二重に変換するため。したがって、バックスラッシュのエスケープが優先され、次の文字は「通常どおり」処理されます):

def doubleBackslash(inputString):
    inputString.replace('\\','\\\\')
    inputString.replace('\a','\\a')
    inputString.replace('\b','\\b')
    inputString.replace('\f','\\f')
    inputString.replace('\n','\\n')
    inputString.replace('\r','\\r')
    inputString.replace('\t','\\t')
    inputString.replace('\v','\\v')
    return inputString

strInputProcessed = doubleBackslash(strInput)

私は取得したい:

lineList = strInputProcessed.splitlines()

>> ['signalArr(0)="ASCB D\axx\bxx\fxx\nxx"','signalArr(1)="root\rxx\txx\vxx"']

私が得たもの:

>> ['signalArr(0)="ASCB D\x07xx\x08xx', 'xx', 'xx"', 'signalArr(1)="root', 'xx\txx', 'xx"']
4

1 に答える 1

5

入力を生の文字列として保存してみると、すべての '\n' 文字が自動的にエスケープされます:

>>> var = r'''abc\n
... cba'''
>>> print var
abc\n
cba
>>> var.splitlines()
['abc\\n', 'bca']

(' の前のrに注意してください。これは、文字列が生であることを示します)

さらに、既存の文字列をエスケープしたい場合は、上記の置換コマンドの代わりに、'string-escape' でエンコードを使用できます。

>>> s = 'abc\nabc\nabc'
>>> s.encode('string-escape')
'abc\\nabc\\nabc'

同様に、必要に応じて、文字列の文字列エスケープを元に戻すことができます。

>>> s.decode('string-escape')

最後に、あなたのコンテキストに追加すると思いました:

>>> strInput = r'''signalArr(0)="ASCB D\axx\bxx\fxx\nxx"
... signalArr(1)="root\rxx\txx\vxx"'''
>>> strInput.splitlines()
['signalArr(0)="ASCB D\\axx\\bxx\\fxx\\nxx"', 'signalArr(1)="root\\rxx\\txx\\vxx"']

余分な \ は印刷された文字列に存在しますが、メモリには実際には存在しません。文字列を反復すると、エスケープに使用される余分な \ 文字が得られないため、これが証明されます。

>>> s = r'\a\b\c'
>>>
>>> for c in s:
...  print c
\
a
\
b
\
c
>>> list(s)
['\\', 'a', '\\', 'b', '\\', 'c']
于 2015-11-21T01:26:40.687 に答える