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))