【问题标题】:Check if a string is not a deserialised json or list in python检查字符串是否不是反序列化的 json 或 python 中的列表
【发布时间】:2016-06-06 09:57:33
【问题描述】:

我有一个字符串,格式如下:

s1 = "Hello HAHA"
s2 = '["Hello HAHA"]'
s3 = "{Hello HAHA}"

我想知道输入字符串是像 s1、s2 还是 s3。我的动机是清理此输入并将其保存为s1 格式。

基本上我需要知道输入字符串是否为s1 形式。

我想到的解决方案:

  1. json.loads(s) 并捕获异常以检查它是否为 json
  2. 正则表达式搜索以查看输入字符串的开始和结束位置是否有{|}|[|],并替换它们。

pythonic的方法是什么?

【问题讨论】:

标签: python regex string


【解决方案1】:

使用strips.strip('[]"{}') 将删除字符串末尾不需要的字符。

>>> unwanted = '[]"{}'

>>> 'Hello HAHA'.strip(unwanted)
'Hello HAHA'

>>> '["Hello HAHA"]'.strip(unwanted)
'Hello HAHA'

>>> '{Hello HAHA}'.strip(unwanted)
'Hello HAHA'

【讨论】:

  • 这是如何回答问题的?例如,并非每个以 [ 开头并以 ] 结尾的字符串在评估后都是有效的列表。我是不是误会了什么?
  • @timgeb 问题说有3种形式。
【解决方案2】:

您处理 JSON 字符串的方法是 correct。我会检查这样的列表:

>>> from ast import literal_eval
>>> def is_listliteral(x):
...     try:
...         return isinstance(literal_eval(x), list)
...     except (SyntaxError, ValueError):
...         return False
>>> is_listliteral('[')
False
>>> is_listliteral('[1,"2",{}]')
True
>>> is_listliteral('{}')
False

我相信您可以编写条件语句来检查 JSON 或列表,然后返回 True 以检查字符串是否都失败。

编辑:有一个缺点:此解决方案仅适用于嵌套列表,前提是其中的对象可以通过 literal_eval(字符串、数字、元组、列表、字典、布尔值和 None)进行评估。

>>> is_listliteral('[1,2,{1,2,3}]')
False

所以它并不完美。对于您的情况,这可能已经足够了。我暂时不知道更好的解决方案。

【讨论】:

  • ast.literal_eval 是这里的重要内容。我也可以用它来测试json。知道什么更有效吗? ujson.loads() 还是 ast.literal_eval()? @timgeb
  • @ketanbhatt “我也可以用它来测试 json。”
【解决方案3】:

正则表达式搜索以查看输入字符串的开始和结束位置是否有{|}|[|],并替换它们。

re.sub(r'^\W+|\W+$', '', string)

re.sub(r'^[\[{"']+|['"}\]]+$', '', string)

这会删除一个或多个存在于开头或结尾的非单词字符。

【讨论】:

  • @PeterWood \W 应该也匹配引号。
猜你喜欢
  • 2016-12-30
  • 2010-11-25
  • 2021-02-15
  • 1970-01-01
  • 2023-03-23
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多