【问题标题】:Replacing and search hexadecimals in a line in python在python中的一行中替换和搜索十六进制
【发布时间】:2012-11-29 21:14:52
【问题描述】:

问题如下:
我正在做一个 file.read(100) 并得到如下的一行:

line='1\x01\x1e17=00000000\x1e54=80300A00\x1e50=1\x1e56=2008080106010414\x1c\x1e247=CD\x1e6=In\x1e5=Boot\x1e180=0.445\x1e179=0.380\x1e55=AAA\x1e57=2008080100000000\x1e212=5000\x1e213=20000\x1e115=500\x1d\x1e29=5T2lqZHNAwg=\x01\x1e17=00000000'

我想要做的是在这一行中搜索十六进制数字并将它们转换为输出新操作的行。
所以基本上我想做:

t=re.findall(r'[\x80-\xff]', line) #Somehow get the positions    
for i in t: ord(i) #Something to this effect to replace all the hexadecimals it finds  

使用我为 t 提供的代码,我找不到行中的所有字符,更不用说它们的位置了。
我想知道是否有人对如何最好地解决这个问题有任何想法。谢谢。

【问题讨论】:

  • 我认为您需要备份一个步骤并询问该输入是否有意义。在我看来,您正在尝试使用不正确的编码读取文件。
  • 该文件是 .dat.gz 在 UNIX 中读取它有很多特殊字符,如 ^^ 等...我知道读取它的唯一方法是简单地使用 gzip 并进行读取.你对编码还有什么想法吗?
  • 您正在寻找\x80-\xff 范围内的字符,但您的字符串中的字符在\x01-\x1f 范围内。我不确定正则表达式解析器将如何处理这些,但这是一个开始的地方。
  • @FancyDolphin 阅读了 kreativitea 的回答。这是对我在说什么的更好的解释。关于编码问题,我只知道我对编码问题一无所知。

标签: python search replace hex


【解决方案1】:

\x 是一个转义的 x,这是一个无效的转义。您的问题不是正则表达式,而是您的编码-您的 line 不是文字字符串。试试printing line,你应该会看到以下内容:

117=0000000054=80300A0050=156=2008080106010414247=CD6=In5=Boot180=0.445179=0.38055=AAA57=2008080100000000212=5000213=20000115=50029=5T2lqZHNAwg=17=00000000

很可能,这就是您所需要的。简而言之,十六进制值就可以了。

如果在此之后,您仍想获取十六进制值,则必须在字符串的开头添加一个 r,如下所示:

line=r'1\x01\x1e17=00000000\x1e54=80300A00\x1e50=1\x1e56=2008080106010414\x1c\x1e247=CD\x1e6=In\x1e5=Boot\x1e180=0.445\x1e179=0.380\x1e55=AAA\x1e57=2008080100000000\x1e212=5000\x1e213=20000\x1e115=500\x1d\x1e29=5T2lqZHNAwg=\x01\x1e17=00000000'

使其成为字符串文字。正则表达式应该像处理任何其他字符串一样处理文字。

【讨论】:

    【解决方案2】:

    您可以找到字符 \x(以及 [0] 和 [len(t) - 1])的所有索引,然后遍历该列表并成对地切片,如 ord(t[i:i+1]) for i in len(t)

    【讨论】:

    • 我一直在运行字符搜索和索引的经验('\x')给出了 ValueError: invalid \x 转义。我想如果我可以获得该行中所有十六进制的列表,那么我可以在列表中搜索项目并替换该行。然而,问题是 python 没有正确找到那些 Hex。
    • 啊哈,反斜杠字符是转义符:要创建一个字符串"\x",你要让s = "\\x"
    • @nair.ashvin 虽然这肯定是他必须处理的问题,但这不是他目前遇到的问题。
    • 同意,除非他真的想搜索原始字符串文字。
    猜你喜欢
    • 2015-09-13
    • 2018-06-06
    • 2022-12-12
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多