如何将字符串中的“\t”拆分为两个单独的字符“\”和“t”? (如何拆分转义序列?)[重复]

Posted

技术标签:

【中文标题】如何将字符串中的“\\t”拆分为两个单独的字符“\\”和“t”? (如何拆分转义序列?)[重复]【英文标题】:How to split "\t" in a string to two separate characters as "\" and "t"? (How to split Escape Sequence?) [duplicate]如何将字符串中的“\t”拆分为两个单独的字符“\”和“t”? (如何拆分转义序列?)[重复] 【发布时间】:2018-06-11 16:02:39 【问题描述】:

我正在尝试将 python 中的字符串拆分为字符列表。我知道在 python 中有很多方法可以做到这一点,但我有一个案例,这些方法没有给我想要的结果。

当我在字符串中明确写入像“\t”这样的特殊字符时会出现问题(我不是指真正的制表符)。

例子:

string = "    Hello \t World."

我需要的输出是:

list_of_chars = [' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\', 't', ' ', 'W', 'o', 'r', 'l', 'd', '.']

但是当我使用this question 中给出的方法时,我得到一个包含'/t' 作为整个字符串的列表- 没有分开。

例子:

> list(string)
> ['H', 'e', 'l', 'l', 'o', 'w', ' ', '\t', ' ', 'W', 'o', 'r', 'l', 'd', '.']

我想知道为什么会发生这种情况以及如何得到我想要的。

【问题讨论】:

string = [x for x in r" Hello \t World."] 是您最接近的。 你需要的输出是不可能的。这是语法错误。 如果你在 Python 中输入了" Hello \t World.",这是真正的选项卡。包含反斜杠-t 的字符串可以是r" Hello \t World."" Hello \\t World."。代码中有字符串还是正在读取文件?... @dividebyzero 我正在阅读类似高级语言的源代码文件,它有我提到的字符串。 【参考方案1】:

您可以相应地替换您的字符串:

import itertools
txt = "    Hello \t World."

specials =  
    '\a' : '\\a', #     ASCII Bell (BEL)
    '\b' : '\\b', #     ASCII Backspace (BS)
    '\f' : '\\f', #     ASCII Formfeed (FF)
    '\n' : '\\n', #     ASCII Linefeed (LF)
    '\r' : '\\r', #     ASCII Carriage Return (CR)
    '\t' : '\\t', #     ASCII Horizontal Tab (TAB)
    '\v' : '\\v'  #     ASCII Vertical Tab (VT)


# edited out: # txt2 = "".join([x if x not in specials else specials[x] for x in txt])
txt2 = itertools.chain(* [(list(specials[x]) if x in specials else [x]) for x in txt])

print(list(txt2))

输出:

[' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\\', 't', ' ', 'W', 
 'o', 'r', 'l', 'd', '.'] 

列表理解看起来更“积极”,并使用list(itertools.chain(*[...])) 而不是list("".join([...])),后者应该更高效。

【讨论】:

@vaultah 酷。只有关于 [key].keys 的新内容 - 带有默认值的 .get() - 应该认为会提供它。在这里找到它:docs.python.org/3/library/stdtypes.html#dict。我阅读了"flatten inner lists" 语法,但无法理解它。感谢您的评论 - 接下来将阅读翻译。【参考方案2】:

你应该看看String Literal 文件,上面写着:

反斜杠 (\) 字符用于转义具有特殊含义的字符,例如换行符、反斜杠本身或引号字符。字符串文字可以选择以字母 r' orR' 为前缀;此类字符串称为原始字符串,并且对反斜杠转义序列使用不同的规则。

在您的示例字符串中,\t 不是两个字符,而是一个表示 ASCII 水平制表符 (TAB) 的字符。

为了告诉您的 Python 解释器这两个是单独的字符,您应该使用原始字符串(在字符串 "" 之前使用 r):

>>> list(r"    Hello \t World.")
[' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\\', 't', ' ', 'W', 'o', 'r', 'l', 'd', '.']

但在这里,您还会在结果列表中看到两个 \\,这只是 Python 表示 \ 的方式。

对于 Python 解释器,'\' 是无效字符串,因为字符串中的 \' 表示 单引号 (')。因此,当您执行'\' 时,它会引发以下错误,因为对于 Python,字符串中没有结束引号:

>>> '\'
  File "<stdin>", line 1
    '\'
      ^
SyntaxError: EOL while scanning string literal

如果您不能将您的字符串声明为原始字符串(因为它已经定义或从其他来源导入),您可以通过将编码设置为“unicode-escape”将其转换为字节字符串:

>>> my_str = "    Hello \t World."

>>> unicode_escaped_string = my_str.encode('unicode-escape')
>>> unicode_escaped_string
b'    Hello \\t World.'

由于是字节串,需要调用chr获取每个字节对应的字符值。例如:

>>> list(map(chr, unicode_escaped_string))
[' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\\', 't', ' ', 'W', 'o', 'r', 'l', 'd', '.']

【讨论】:

【参考方案3】:

您也许可以转换为 Python 的文字字符串,然后逐个字符拆分?

string = "    Hello \t World."
string_raw = string.encode('unicode-escape')
print([ch for ch in string_raw])
print([chr(ch) for ch in string_raw])

输出:

[32, 32, 32, 32, 72, 101, 108, 108, 111, 32, 92, 116, 32, 87, 111, 114, 108, 100, 46]
[' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\\', 't', ' ', 'W', 'o', 'r', 'l', 'd', '.']

Ascii 92 是一个单一的反冲,即使当您在终端中打印它时,它也会显示它已转义。

【讨论】:

【参考方案4】:

\t 表示制表符,如果你想明确地有一个\ 字符,你需要在你的字符串中转义它:

string = "    Hello \\t World."

或者使用原始字符串:

string = r"    Hello \t World."

【讨论】:

以上是关于如何将字符串中的“\t”拆分为两个单独的字符“\”和“t”? (如何拆分转义序列?)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分为标记并将标记分成两个单独的数组

如何将字符串字典转换为字典并拆分为单独的列

如何在javascript中的两个分隔符之间拆分字符串?

SQL:使用 SQL 将两个逗号分隔的字符串拆分为单独的索引行

如何将返回文本拆分为 extjs 中的单个字符串?

如何拆分一列字符串,并从单独的元素创建行? [复制]