【问题标题】:python with hex string change \u0026 to &带有十六进制字符串的 python 将 \u0026 更改为 &
【发布时间】:2019-05-26 10:09:30
【问题描述】:

我有一个这样的字符串:

downloadFile":"/myportal/ABC/35/audio/182/audio?Id=996\u0026stepNo=0\u0026resource=996-0-dde82d48-3097-4835-a1e4-30602c460fd7-1.wav

我需要将 \u0026(十六进制)更改为 & 我什至试过这个-->

.replace("\u0026","&")  

没用

【问题讨论】:

  • 请展示您的尝试。使用相同的代码,我得到了正确的结果。
  • 我猜原始输入类似于a = "\\u0026",用2个反斜杠输入一个真正的“\”,OP要求re.escape的反向函数。但是我找不到好的解决方案。
  • 如果我的猜测是正确的,那么此时所有的答案都是错误的,因为如果我们输入a = "\u0026"那么a现在是“&”,一个正常的转义,不需要转换。

标签: python hex


【解决方案1】:

正如我的评论所说,我猜“\u0026”是一个转义字符串。

也就是说,真正的输入应该是这样的

a = "\\u0026"

用双反斜杠输入真正的“\”。

那么,我们可以使用json.loads 作为re.escape 的逆向函数,例如:

import json
json.loads("{\"downloadFile\":\"/myportal/ABC/35/audio/182/audio?Id=996\\u0026stepNo=0\\u0026resource=996-0-dde82d48-3097-4835-a1e4-30602c460fd7-1.wav\"}")
# output: 
# {'downloadFile': '/myportal/ABC/35/audio/182/audio?Id=996&stepNo=0&resource=996-0-dde82d48-3097-4835-a1e4-30602c460fd7-1.wav'}

或者把它包装成一个函数:

def deescape(escaped):
    return str(json.loads("{\"s\":\"" + escaped + "\"}"))[7 : -2]

deescape("\\u0026") # return '&'

更新: 如果escaped 包含“:”,则此解决方案不适用。真正的解决方案should be

# Python 2
def deescape(escaped)
    return escaped.decode('string_escape')

# Python 3
def deescape(escaped)
    return escaped.encode().decode('unicode_escape')

【讨论】:

    【解决方案2】:

    说到网址,请帮个忙,用urllib,这里你需要urllib.parse.unquote

    import urllib.parse
    
    url = "/myportal/ABC/35/audio/182/audio?Id=996\u0026stepNo=0\u0026resource=996-0-dde82d48-3097-4835-a1e4-30602c460fd7-1.wav"
    print(urllib.parse.unquote(url))
    

    如果是 Python2.x,请使用 import urlliburllib.unquote()

    【讨论】:

      【解决方案3】:

      据我所知,downloadFile 之后的冒号上似乎有引号,这可能会导致错误。您可以使用反斜杠 (\) 转义它们,如下所示:

      yourVar = "downloadFile\":\"/myportal/ABC/35/audio/182/audio?Id=996\u0026stepNo=0\u0026resource=996-0-dde82d48-3097-4835-a1e4-30602c460fd7-1.wav"
      yourVar.replace("\u0026","&")
      

      您可以选择使用单引号定义变量,因为这可以让您当前的字符串工作,因为冒号周围的双引号将被忽略:

      yourVar = 'downloadFile":"/myportal/ABC/35/audio/182/audio?Id=996\u0026stepNo=0\u0026resource=996-0-dde82d48-3097-4835-a1e4-30602c460fd7-1.wav'
      yourVar.replace("\u0026","&")
      

      For reference I have added what I ran in my console since the code worked fine for me

      【讨论】:

        【解决方案4】:

        对我有用的唯一方法是使用 --> \u0026 note double \

        myStr.replace("\\u0026","&")
        

        【讨论】:

          【解决方案5】:

          试试这个代码:

          downloadFile ="/myportal/ABC/35/audio/182/audio?Id=996\u0026stepNo=0\u0026resource=996-0-dde82d48-3097-4835-a1e4-30602c460fd7-1.wav"
          
          print(downloadFile.replace("\u0026","&"))
          

          输出:

          /myportal/ABC/35/audio/182/audio?Id=996&stepNo=0&resource=996-0-dde82d48-3097-4835-a1e4-30602c460fd7-1.wav
          

          【讨论】:

            【解决方案6】:

            我刚刚遇到这个问题并稍微调整了the code 提供的Geno Chen 对我有用。我使用的功能是:

            def deescape(escaped):
            return escaped.encode().decode('unicode_escape').encode().decode("utf-8", "replace")
            

            我在 lambda 函数中使用它来将其应用于熊猫系列中的所有记录。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-08-09
              • 2016-04-22
              • 2014-05-01
              • 2013-08-05
              • 2020-06-20
              • 2018-01-31
              • 2019-07-27
              • 1970-01-01
              相关资源
              最近更新 更多