【问题标题】:Split array byte string in Python在 Python 中拆分数组字节字符串
【发布时间】:2014-08-31 17:59:03
【问题描述】:

我正在尝试像这样拆分一串字节:

'\xf0\x9f\x98\x84 \xf0\x9f\x98\x83 \xf0\x9f\x98\x80 \xf0\x9f\x98\x8a \xe2\x98\xba \xf0\x9f\x98\x89 \xf0\x9f\x98\x8d \xf0\x9f\x98\x98 \xf0\x9f\x98\x9a \xf0\x9f\x98\x97 \xf0\x9f\x98\x99 \xf0\x9f\x98\x9c \xf0\x9f\x98\x9d \xf0\x9f\x98\x9b \xf0\x9f\x98\x81 \xf0\x9f\x98\x82 \xf0\x9f\x98\x85 \xf0\x9f\x98\x86 \xf0\x9f\x98\x8b \xf0\x9f\x98\x8e \xf0\x9f\x98\xac \xf0\x9f\x98\x87'

变成这样:

'\xf0\x9f\x98\x84', '\xf0\x9f\x98\x83', etc.

但是,split() 方法返回给我的是这样的:

'xf0', 'x9f' 'x98' etc.

我试过split(" "),但它似乎不起作用。如何实现上述目标?

【问题讨论】:

  • 您使用的是什么“拆分”方法?看起来它不理解 \x 转义序列,并且认为反斜杠只是转义了下一个字符。
  • 您使用了哪些代码来获取单个字符?您永远无法通过拆分输入获得'xf0';这是包含 3 个字符的字符串,x 后跟 2 位十六进制数字。听起来好像您将字符串视为序列而不是拆分它们,从而导致每个字符串只有一个字符(如'\xf0',请注意反斜杠)。
  • ... 是在 `\` 上分裂吗?
  • 使用 split(' ') 代替 split(" ") 以空格分割。
  • @Boop:这两个方法调用之间没有区别。两者都按空格分开。

标签: python regex python-2.7


【解决方案1】:

str.split(' ') 甚至只是 str.split()(在任意宽度的空白处分割)在您的输入中工作得很好:

sample = '\xf0\x9f\x98\x84 \xf0\x9f\x98\x83 \xf0\x9f\x98\x80 \xf0\x9f\x98\x8a \xe2\x98\xba \xf0\x9f\x98\x89 \xf0\x9f\x98\x8d \xf0\x9f\x98\x98 \xf0\x9f\x98\x9a \xf0\x9f\x98\x97 \xf0\x9f\x98\x99 \xf0\x9f\x98\x9c \xf0\x9f\x98\x9d \xf0\x9f\x98\x9b \xf0\x9f\x98\x81 \xf0\x9f\x98\x82 \xf0\x9f\x98\x85 \xf0\x9f\x98\x86 \xf0\x9f\x98\x8b \xf0\x9f\x98\x8e \xf0\x9f\x98\xac \xf0\x9f\x98\x87'
parts = sample.split()

演示:

>>> sample = '\xf0\x9f\x98\x84 \xf0\x9f\x98\x83 \xf0\x9f\x98\x80 \xf0\x9f\x98\x8a \xe2\x98\xba \xf0\x9f\x98\x89 \xf0\x9f\x98\x8d \xf0\x9f\x98\x98 \xf0\x9f\x98\x9a \xf0\x9f\x98\x97 \xf0\x9f\x98\x99 \xf0\x9f\x98\x9c \xf0\x9f\x98\x9d \xf0\x9f\x98\x9b \xf0\x9f\x98\x81 \xf0\x9f\x98\x82 \xf0\x9f\x98\x85 \xf0\x9f\x98\x86 \xf0\x9f\x98\x8b \xf0\x9f\x98\x8e \xf0\x9f\x98\xac \xf0\x9f\x98\x87'
>>> sample.split()
['\xf0\x9f\x98\x84', '\xf0\x9f\x98\x83', '\xf0\x9f\x98\x80', '\xf0\x9f\x98\x8a', '\xe2\x98\xba', '\xf0\x9f\x98\x89', '\xf0\x9f\x98\x8d', '\xf0\x9f\x98\x98', '\xf0\x9f\x98\x9a', '\xf0\x9f\x98\x97', '\xf0\x9f\x98\x99', '\xf0\x9f\x98\x9c', '\xf0\x9f\x98\x9d', '\xf0\x9f\x98\x9b', '\xf0\x9f\x98\x81', '\xf0\x9f\x98\x82', '\xf0\x9f\x98\x85', '\xf0\x9f\x98\x86', '\xf0\x9f\x98\x8b', '\xf0\x9f\x98\x8e', '\xf0\x9f\x98\xac', '\xf0\x9f\x98\x87']

但是,如果这是二进制数据,则需要注意这些 4 字节值中没有 \x20 字节。最好只生成 5 个字节的块,然后删除最后一个字节:

for i in range(0, len(sample), 5):
    chunk = sample[i:i + 4]  # ignore the 5th byte, a space

演示:

>>> for i in range(0, len(sample), 5):
...     chunk = sample[i:i + 4]  # ignore the 5th byte, a space
...     print chunk.decode('utf8')
...     if i == 20: break
... 
?
?
?
?
# On browsers that support it, those are various smiling emoji

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2017-11-07
    • 2015-07-01
    相关资源
    最近更新 更多