Python:将复杂的类似列表的字符串转换为列表(没有混合字节和非字节文本的SyntaxError)

Python:将复杂的类似列表的字符串转换为列表(没有混合字节和非字节文本的SyntaxError),python,string,list,numpy,Python,String,List,Numpy,我有一个字符串:u'[“A”,“B”,“C”,“D”]' 我想得到这样一个列表:[“a”,“B”,“C”,“D”]*编辑为“B”确实无效 有些人在内部使用“”或“”来转义“”或“”或两者 我尝试了以下各种解决方案: (一) 结果: [ "A", """B""",'C' , " D"] <class 'str'> 结果 SyntaxError: cannot mix bytes and nonbytes literals 还有其他方法吗?(我正在使用Python 3.6) 我想到

我有一个字符串:
u'[“A”,“B”,“C”,“D”]'

我想得到这样一个列表:
[“a”,“B”,“C”,“D”]
*编辑为“B”确实无效

有些人在内部使用“”或“”来转义“”或“”或两者

我尝试了以下各种解决方案:

(一)

结果:

[ "A", """B""",'C' , " D"]
<class 'str'>
结果

SyntaxError: cannot mix bytes and nonbytes literals
还有其他方法吗?(我正在使用Python 3.6)


我想到了正则表达式或简单的字符串替换,但当我想到所有在列表元素中避免替换“,”等字符的情况时,使用
ast.literal\u eval
会很快变得复杂。我们可以用正则表达式来解决这个问题。不幸的是,这并不容易。不过,我有一颗银弹给你

首先,让我们确定具有相同类型的内部引号的所有带引号的子字符串:

(?<=[\[,])\s*(['\"])(?:(\1)|.)*?\1(?=\s*[,\]])
这里的关键思想是完全忽略正则表达式引擎返回的所有匹配:
$0
是垃圾桶。相反,我们只需要检查捕获组
$1
,设置后,它包含我们要查找的内容。基本上,所有这些未捕获的替换都匹配用引号括起来的规则的、正确转义的子字符串。我们只想要那些没有替罪羊的

我决定重新组合原始字符串,添加必要的
\
,以正确转义那些未转义的引号。当然还有其他方法

最后,将完整的示例代码()放在一起:

重新导入
导入ast
测试=(“[\'A\',\'B\','C',\'D\'”)\n
“[\'A\',\'B'\','C',\'D\'”]\n”
[\'A\'、'B'、'C'、\'D\']\n
“[\'A\','\'B\','C',\'D\']\n”
“[\'A\','8点钟','C',\'D\'”]\n”
“[\'A\',\'Ol'8点钟\','C','D\'”]\n”
“[\”一些文本\“]\n”
“[\”更多文本\“]\n”
“[\”关于\\\\\\\\“\\”的更多文本]\n”
“[\“Ol'8点钟\”]\n”
“['8点钟]\n”
“['8点钟]\n”
“['Ol'8点钟]\n”
“[\”\“B\”]\n”
“[\\\\\”B\“]\n”
“[\”\B\“]\n”
“[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
“[\”“\\”B\“]”)
结果=u''
最后的索引=0

regex1=r“(?
“B”
不是valid@bobrobbob是的,如果它像
u'.[“A”,“B”,“C”,“D”]'.
那样有效,你可以做
eval
你能提供一些复杂的例子吗?
import ast
List = ast.literal_eval(s)
print(List)
print(type(List))
SyntaxError: cannot mix bytes and nonbytes literals
(?<=[\[,])\s*(['\"])(?:(\1)|.)*?\1(?=\s*[,\]])
^"[^"\\]*(?:\\.[^\"\\]*)*"$|^'[^'\\]*(?:\\.[^'\\]*)*'$|^\s*["'][^"'\\]*|["']\s*$|\\.|(["'])[^"'\\\n]*
import re
import ast

test = ("[ \"A\", \"\"B\"\",'C' , \" D\"]\n"
    "[ \"A\", \"'B'\",'C' , \" D\"]\n"
    "[ \"A\", ''B'','C' , \" D\"]\n"
    "[ \"A\", '\"B\"','C' , \" D\"]\n"
    "[ \"A\", '8 o'clock','C' , \" D\"]\n"
    "[ \"A\", \"Ol' 8 o'clock\",'C' , \" D\"]\n"
    "[\"Some Text\"]\n"
    "[\"Some more Text\"]\n"
    "[\"Even more text about \\\"this text\\\"\"]\n"
    "[\"Ol' 8 o'clock\"]\n"
    "['8 o'clock']\n"
    "[ '8 o'clock']\n"
    "['Ol' 8 o'clock']\n"
    "[\"\"B\"]\n"
    "[\"\\\"B\"]\n"
    "[\"\\\\\"B\"]\n"
    "[\"\\\\\\\"B\"]\n"
    "[\"\\\\\\\\\"B\"]")
result = u''
last_index = 0
regex1 = r"(?<=[\[,])\s*(['\"])(?:(\1)|.)*?\1(?=\s*[,\]])" #nested quotes of the same type
regex2 = r'''^"[^"\\]*(?:\\.[^\"\\]*)*"$|^'[^'\\]*(?:\\.[^'\\]*)*'$|^\s*["'][^"'\\]*|["']\s*$|\\.|(["'])[^"'\\\n]*''' # unescaped quotes in $1
matches = re.finditer(regex1, test, re.MULTILINE)
for match in matches:
    if match.groups()[1] is not None: #nested quotes of the same type present
        print(match.group())
        inner = re.finditer(regex2, match.group())
        for m in inner:            
            if m.groups()[0] is not None: # unescaped quotes in $1 present
                result += test[last_index:match.start() + m.start()] + '\\' + m.group()
                last_index = match.start()+m.end()
result += test[last_index:len(test)]
print(result)

for test_str in result.split("\n"):
    List = ast.literal_eval(test_str)
    print(List)
    print(type(List))