【问题标题】:extract list or tuple inside string提取字符串内的列表或元组
【发布时间】:2016-11-21 12:07:10
【问题描述】:

我从通过以太网连接的外部设备获取输入,它正在传递几个字符串类型的值,例如value = '(2,2)\n'。我想将这些值分配给列表或元组变量,例如final_value = (2,2)。 我使用的代码如下:

import socket
sock = socket.socket()
value =sock.recv(buffersize=2048)
formatted_value = eval(value)

我读到我现在用来获取列表的 eval 函数不是一种非常安全的方法,因为外部设备可能会传递一个危险的脚本。所以,我想知道有没有替代方法,类似于函数int(),可以用来从字符串中获取整数。

【问题讨论】:

  • 字符串列表是否总是以 (x,x) 格式返回?
  • (2, 2) 是一个元组,你想要一个元组还是一个列表?
  • @StevenSummers 该字符串是帖子中的形式。实际上,最终值可以是元组或列表。我没有意识到我在发布一个元组,抱歉。
  • @pshep123 字符串列表始终具有 '(x1,x2)\n' 格式,即 x1 和 x2 整数

标签: python string format


【解决方案1】:

使用ast module literal_eval 方法进行更安全的评估

import ast
formatted_value = ast.literal_eval(value)

【讨论】:

    【解决方案2】:

    如果你知道输入包含一个元组

    from ast import literal_eval as make_tuple
    make_tuple(value)
    

    【讨论】:

      【解决方案3】:

      请给出你可以做的替代方法。

      s = '(2, 2)\n'
      s = s.strip()
      if s.startswith('(') and s.endswith(')'):
          tup = tuple(int(i) for i in s[1:-1].split(','))
          print(tup)
      

      或者如果你想要一个列表

      s = '(2, 2)\n'
      s = s.strip()
      if s.startswith('(') and s.endswith(')'):
          lst = [int(i) for i in s[1:-1].split(',')]
          print(lst)
      

      【讨论】:

        猜你喜欢
        • 2019-09-13
        • 2013-09-04
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 2022-08-18
        • 2012-07-15
        相关资源
        最近更新 更多