Python 3.5中用于包含反斜杠的多行字符串的splitlines函数

5

如何有效地将包含反斜杠的多行字符串分割成单独的行,从而避免产生不必要的转义字符?

这里是我正在处理的示例输入:

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"']
1个回答

6

尝试将输入存储为原始字符串,这样所有的 '\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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接