【问题标题】:Python 3.5 splitlines for multiline string containing backslashes用于包含反斜杠的多行字符串的 Python 3.5 分割线
【发布时间】:2016-02-23 14:51:05
【问题描述】:

如何有效地将包含反斜杠的多行字符串拆分为单独的行?

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

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"']

【问题讨论】:

    标签: python escaping string-split multilinestring


    【解决方案1】:

    尝试将您的输入存储为原始字符串,然后所有 '\n' 字符将自动转义:

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

    (注意 ' 之前的 r。这表示字符串是原始的)

    另外,如果您希望转义现有字符串,而不是上面执行的替换命令,您可以使用 encode 和 '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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多