如何将字符串中的“\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' or
R' 为前缀;此类字符串称为原始字符串,并且对反斜杠转义序列使用不同的规则。
在您的示例字符串中,\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”? (如何拆分转义序列?)[重复]的主要内容,如果未能解决你的问题,请参考以下文章