z00*_*00x 4 python string python-3.x
我试图将python中的字符串拆分为字符列表.我知道在python中有很多方法可以做到这一点,但我有一个案例,那些方法不能给我想要的结果.
当我在字符串中显式写入'\ t'之类的特殊字符时,会出现问题(我并不是指真正的标签).
例:
string = " Hello \t World."
Run Code Online (Sandbox Code Playgroud)
我需要的输出是:
list_of_chars = [' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\', 't', ' ', 'W', 'o', 'r', 'l', 'd', '.']
Run Code Online (Sandbox Code Playgroud)
但是当我使用这个问题中给出的方法时,我得到一个包含'/ t'作为整个字符串的列表 - 没有分开.
例:
> list(string)
> ['H', 'e', 'l', 'l', 'o', 'w', ' ', '\t', ' ', 'W', 'o', 'r', 'l', 'd', '.']
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会这样,以及如何得到我想要的东西.
您可以相应地替换您的字符串:
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))
Run Code Online (Sandbox Code Playgroud)
输出:
[' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\\', 't', ' ', 'W',
'o', 'r', 'l', 'd', '.']
Run Code Online (Sandbox Code Playgroud)
列表理解看起来更"积极",使用list(itertools.chain(*[...]))而不是list("".join([...]))应该更高效.
你应该看一下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', '.']
Run Code Online (Sandbox Code Playgroud)
但是在这里你也会\\在结果列表中看到两个,这只是Python的表示方式\.
对于Python,解释器'\'是一个无效的字符串,因为\'在字符串中表示单引号(').因此,当你这样做时'\',它会引发误差,因为对于Python,字符串中没有结束引号:
>>> '\'
File "<stdin>", line 1
'\'
^
SyntaxError: EOL while scanning string literal
Run Code Online (Sandbox Code Playgroud)
如果您不能将字符串声明为原始字符串(因为它已经定义或从其他来源导入),您可以通过将编码设置为"unicode-escape"将其转换为字节字符串:
>>> my_str = " Hello \t World."
>>> unicode_escaped_string = my_str.encode('unicode-escape')
>>> unicode_escaped_string
b' Hello \\t World.'
Run Code Online (Sandbox Code Playgroud)
由于它是一个字节字符串,因此需要调用chr以获取每个字节的相应字符值.例如:
>>> list(map(chr, unicode_escaped_string))
[' ', ' ', ' ', ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\\', 't', ' ', 'W', 'o', 'r', 'l', 'd', '.']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
947 次 |
| 最近记录: |