【问题标题】:Convert string with "\x" character to float将带有“\x”字符的字符串转换为浮点数
【发布时间】:2019-09-24 21:09:36
【问题描述】:

我正在使用float(x) 将字符串转换为浮点数。但是由于某种原因,其中一个字符串是"71.2\x0060"。我试过关注这个answer,但它不会删除字节字符

>>> s = "71.2\x0060"
>>> "".join([x for x in s if ord(x) < 127])
'71.2\x0060'

我尝试过的其他方法是:

>>> s.split("\\x")
['71.2\x0060']
>>> s.split("\x")
ValueError: invalid \x escape

我不确定为什么这个字符串的格式不正确,但我想从这个字符串中获得尽可能高的精度并继续前进。

【问题讨论】:

  • 人物是\x00

标签: python-3.x


【解决方案1】:

脱离 wim 的评论,答案可能是这样的:

>>> s.split("\x00")
['71.2', '60']

所以我应该这样做:

>>> float(s.split("\x00")[0])
71.2

【讨论】:

  • 拆分后加入他们:''.join(r'71.2\x0060'.split(r'\x00')) 返回'71.260'
【解决方案2】:

很遗憾,re 模块中不存在 POSIX 组 \p{XDigit}。无论如何要使用正则表达式删除十六进制控制字符,您可以尝试以下操作。

impore re
re.sub(r'[\x00-\x1F]', r'', '71.2\x0060')  # or:
re.sub(r'\\x[0-9a-fA-F]{2}', r'', r'71.2\x0060')

输出:

'71.260'
'71.260'

r 表示原始。查看 ASCII 表中最多十六进制 1F 的控制字符:https://www.torsten-horn.de/techdocs/ascii.htm

【讨论】:

  • 对此我有点不舒服(只是因为我不明白问题从哪里开始),这个数字来自71.239471.2727 之间的日志文件以及每个数字有 4 个小数点。忽略这个角色并加入似乎是错误的。如果号码是71.260\x00,我会更高兴71.260的结果
  • 也许\x00 意味着0?然后:s.replace('\x00', '0')。否则,您可以在第一个 re.sub 参数中使用 r'[\x00-\x1F][0-9]*$' 删除直到最后 - 或使用您的拆分解决方案。 :)
猜你喜欢
  • 2011-11-25
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2020-09-02
相关资源
最近更新 更多